diff options
153 files changed, 777 insertions, 792 deletions
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 7deeae7bf7..23df74e6fd 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -234,20 +234,20 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) last_shuttle_request = last_peak_grab = 0; // get_microseconds(); - ARDOUR::Diskstream::DiskOverrun.connect (forever_connections, sigc::mem_fun(*this, &ARDOUR_UI::disk_overrun_handler)); - ARDOUR::Diskstream::DiskUnderrun.connect (forever_connections, sigc::mem_fun(*this, &ARDOUR_UI::disk_underrun_handler)); + ARDOUR::Diskstream::DiskOverrun.connect (forever_connections, boost::bind (&ARDOUR_UI::disk_overrun_handler, this), gui_context()); + ARDOUR::Diskstream::DiskUnderrun.connect (forever_connections, boost::bind (&ARDOUR_UI::disk_underrun_handler, this), gui_context()); /* handle dialog requests */ - ARDOUR::Session::Dialog.connect (forever_connections, sigc::mem_fun(*this, &ARDOUR_UI::session_dialog)); + ARDOUR::Session::Dialog.connect (forever_connections, ui_bind (&ARDOUR_UI::session_dialog, this, _1), gui_context()); - /* handle pending state with a dialog */ + /* handle pending state with a dialog (PROBLEM: needs to return a value and thus cannot be x-thread) */ - ARDOUR::Session::AskAboutPendingState.connect (forever_connections, sigc::mem_fun(*this, &ARDOUR_UI::pending_state_dialog)); + ARDOUR::Session::AskAboutPendingState.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::pending_state_dialog, this)); - /* handle sr mismatch with a dialog */ + /* handle sr mismatch with a dialog (PROBLEM: needs to return a value and thus cannot be x-thread) */ - ARDOUR::Session::AskAboutSampleRateMismatch.connect (forever_connections, sigc::mem_fun(*this, &ARDOUR_UI::sr_mismatch_dialog)); + ARDOUR::Session::AskAboutSampleRateMismatch.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::sr_mismatch_dialog, this, _1, _2)); /* lets get this party started */ @@ -329,10 +329,10 @@ ARDOUR_UI::create_engine () return -1; } - engine->Stopped.connect (forever_connections, sigc::mem_fun(*this, &ARDOUR_UI::engine_stopped)); - engine->Running.connect (forever_connections, sigc::mem_fun(*this, &ARDOUR_UI::engine_running)); - engine->Halted.connect (forever_connections, sigc::mem_fun(*this, &ARDOUR_UI::engine_halted)); - engine->SampleRateChanged.connect (forever_connections, sigc::mem_fun(*this, &ARDOUR_UI::update_sample_rate)); + engine->Stopped.connect (forever_connections, boost::bind (&ARDOUR_UI::engine_stopped, this), gui_context()); + engine->Running.connect (forever_connections, boost::bind (&ARDOUR_UI::engine_running, this), gui_context()); + engine->Halted.connect (forever_connections, boost::bind (&ARDOUR_UI::engine_halted, this), gui_context()); + engine->SampleRateChanged.connect (forever_connections, ui_bind (&ARDOUR_UI::update_sample_rate, this, _1), gui_context()); post_engine (); @@ -407,7 +407,7 @@ ARDOUR_UI::post_engine () update_cpu_load (); update_sample_rate (engine->frame_rate()); - Config->ParameterChanged.connect (forever_connections, sigc::mem_fun (*this, &ARDOUR_UI::parameter_changed)); + Config->ParameterChanged.connect (forever_connections, ui_bind (&ARDOUR_UI::parameter_changed, this, _1), gui_context()); boost::function<void (string)> pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1)); Config->map_parameters (pc); diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 7cbf0df3e2..a15d8fc2be 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -37,6 +37,7 @@ #include "theme_manager.h" #include "bundle_manager.h" #include "keyeditor.h" +#include "gui_thread.h" #include "i18n.h" @@ -113,14 +114,15 @@ ARDOUR_UI::set_session (Session *s) Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::sync_blink)); Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::audition_blink)); - _session->Xrun.connect (_session_connections, sigc::mem_fun(*this, &ARDOUR_UI::xrun_handler)); - _session->RecordStateChanged.connect (_session_connections, sigc::mem_fun (*this, &ARDOUR_UI::record_state_changed)); - _session->locations()->added.connect (_session_connections, sigc::mem_fun (*this, &ARDOUR_UI::handle_locations_change)); - _session->locations()->removed.connect (_session_connections, sigc::mem_fun (*this, &ARDOUR_UI::handle_locations_change)); - _session->TransportStateChange.connect (_session_connections, sigc::mem_fun(*this, &ARDOUR_UI::map_transport_state)); - _session->AuditionActive.connect (_session_connections, sigc::mem_fun(*this, &ARDOUR_UI::auditioning_changed)); - _session->SoloActive.connect (_session_connections, sigc::mem_fun(*this, &ARDOUR_UI::soloing_changed)); - _session->DirtyChanged.connect (_session_connections, sigc::mem_fun(*this, &ARDOUR_UI::update_autosave)); + _session->RecordStateChanged.connect (_session_connections, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context()); + _session->TransportStateChange.connect (_session_connections, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context()); + _session->DirtyChanged.connect (_session_connections, boost::bind (&ARDOUR_UI::update_autosave, this), gui_context()); + + _session->Xrun.connect (_session_connections, ui_bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context()); + _session->SoloActive.connect (_session_connections, ui_bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context()); + _session->AuditionActive.connect (_session_connections, ui_bind (&ARDOUR_UI::auditioning_changed, this, _1), gui_context()); + _session->locations()->added.connect (_session_connections, ui_bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context()); + _session->locations()->removed.connect (_session_connections, ui_bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context()); /* Clocks are on by default after we are connected to a session, so show that here. */ diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index f917fd429d..acd49fb2a9 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -270,7 +270,7 @@ ARDOUR_UI::toggle_editing_space() void ARDOUR_UI::setup_session_options () { - _session->config.ParameterChanged.connect (_session_connections, sigc::mem_fun (*this, &ARDOUR_UI::parameter_changed)); + _session->config.ParameterChanged.connect (_session_connections, ui_bind (&ARDOUR_UI::parameter_changed, this, _1), gui_context()); boost::function<void (std::string)> pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1)); _session->config.map_parameters (pc); } diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index 0847031df4..86497709c6 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -35,6 +35,7 @@ #include "audio_clock.h" #include "utils.h" #include "keyboard.h" +#include "gui_thread.h" #include "i18n.h" using namespace ARDOUR; @@ -214,7 +215,7 @@ AudioClock::AudioClock (std::string clock_name, bool transient, std::string widg clock_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK); clock_base.signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &AudioClock::field_button_release_event), Timecode_Hours)); - Session::TimecodeOffsetChanged.connect (_session_connections, sigc::mem_fun (*this, &AudioClock::timecode_offset_changed)); + Session::TimecodeOffsetChanged.connect (_session_connections, boost::bind (&AudioClock::timecode_offset_changed, this), gui_context()); if (editable) { setup_events (); diff --git a/gtk2_ardour/audio_region_editor.cc b/gtk2_ardour/audio_region_editor.cc index c95ecc5616..90875a08d4 100644 --- a/gtk2_ardour/audio_region_editor.cc +++ b/gtk2_ardour/audio_region_editor.cc @@ -155,7 +155,7 @@ AudioRegionEditor::AudioRegionEditor (Session* s, boost::shared_ptr<AudioRegion> bounds_changed (Change (StartChanged|LengthChanged|PositionChanged|Region::SyncOffsetChanged)); gain_changed (); - _region->StateChanged.connect (state_connection, sigc::mem_fun(*this, &AudioRegionEditor::region_changed)); + _region->StateChanged.connect (state_connection, ui_bind (&AudioRegionEditor::region_changed, this, _1), gui_context()); spin_arrow_grab = false; @@ -228,7 +228,8 @@ AudioRegionEditor::connect_editor_events () gain_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &AudioRegionEditor::gain_adjustment_changed)); audition_button.signal_toggled().connect (sigc::mem_fun(*this, &AudioRegionEditor::audition_button_toggled)); - _session->AuditionActive.connect (audition_connection, sigc::mem_fun(*this, &AudioRegionEditor::audition_state_changed)); + + _session->AuditionActive.connect (audition_connection, ui_bind (&AudioRegionEditor::audition_state_changed, this, _1), gui_context()); } void diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index 3713242101..b8f08456d4 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -868,7 +868,7 @@ AudioRegionView::create_waves () // cerr << "\tchannel " << n << endl; if (wait_for_data) { - if (audio_region()->audio_source(n)->peaks_ready (boost::bind (&AudioRegionView::peaks_ready_handler, this, n), data_ready_connection)) { + if (audio_region()->audio_source(n)->peaks_ready (boost::bind (&AudioRegionView::peaks_ready_handler, this, n), data_ready_connection, gui_context())) { // cerr << "\tData is ready\n"; create_one_wave (n, true); } else { @@ -1186,7 +1186,7 @@ AudioRegionView::add_ghost (TimeAxisView& tv) ghost->set_colors(); ghosts.push_back (ghost); - ghost->GoingAway.connect (*this, boost::bind (&RegionView::remove_ghost, this, _1)); + ghost->GoingAway.connect (*this, ui_bind (&RegionView::remove_ghost, this, _1), gui_context()); return ghost; } diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc index 6fb481db2d..b95377a58c 100644 --- a/gtk2_ardour/audio_streamview.cc +++ b/gtk2_ardour/audio_streamview.cc @@ -66,7 +66,7 @@ AudioStreamView::AudioStreamView (AudioTimeAxisView& tv) use_rec_regions = tv.editor().show_waveforms_recording (); - Config->ParameterChanged.connect (*this, sigc::mem_fun (*this, &AudioStreamView::parameter_changed)); + Config->ParameterChanged.connect (*this, ui_bind (&AudioStreamView::parameter_changed, this, _1), gui_context()); } AudioStreamView::~AudioStreamView () @@ -190,7 +190,7 @@ AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wai /* catch region going away */ - r->GoingAway.connect (*this, boost::bind (&AudioStreamView::remove_region_view, this, boost::weak_ptr<Region> (r))); + r->GoingAway.connect (*this, boost::bind (&AudioStreamView::remove_region_view, this, boost::weak_ptr<Region> (r)), gui_context()); RegionViewAdded (region_view); @@ -288,7 +288,7 @@ AudioStreamView::playlist_changed (boost::shared_ptr<Diskstream> ds) boost::shared_ptr<AudioPlaylist> apl = boost::dynamic_pointer_cast<AudioPlaylist>(ds->playlist()); if (apl) { - apl->NewCrossfade.connect (playlist_connections, boost::bind (&AudioStreamView::add_crossfade, this, _1)); + apl->NewCrossfade.connect (playlist_connections, ui_bind (&AudioStreamView::add_crossfade, this, _1), gui_context()); } } @@ -347,7 +347,7 @@ AudioStreamView::add_crossfade (boost::shared_ptr<Crossfade> crossfade) region_color, *lview, *rview); cv->set_valid (true); - crossfade->Invalidated.connect (*this, sigc::mem_fun (*this, &AudioStreamView::remove_crossfade)); + crossfade->Invalidated.connect (*this, ui_bind (&AudioStreamView::remove_crossfade, this, _1), gui_context()); crossfade_views[cv->crossfade] = cv; if (!_trackview.session()->config.get_xfades_visible() || !crossfades_visible) { cv->hide (); @@ -482,10 +482,9 @@ AudioStreamView::setup_rec_box () boost::shared_ptr<AudioFileSource> src = ads->write_source (n); if (src) { sources.push_back (src); - - (src->PeakRangeReady.connect (rec_data_ready_connections, - boost::bind (&AudioStreamView::rec_peak_range_ready, - this, _1, _2, boost::weak_ptr<Source>(src)))); + src->PeakRangeReady.connect (rec_data_ready_connections, + ui_bind (&AudioStreamView::rec_peak_range_ready, this, _1, _2, boost::weak_ptr<Source>(src)), + gui_context()); } } diff --git a/gtk2_ardour/audio_time_axis.cc b/gtk2_ardour/audio_time_axis.cc index 0105e1846c..7236c5dea6 100644 --- a/gtk2_ardour/audio_time_axis.cc +++ b/gtk2_ardour/audio_time_axis.cc @@ -56,6 +56,7 @@ #include "canvas_impl.h" #include "crossfade_view.h" #include "enums.h" +#include "gui_thread.h" #include "automation_time_axis.h" #include "keyboard.h" #include "playlist_selector.h" @@ -108,7 +109,7 @@ AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session* sess, boost::sh } if (_route->panner()) { - _route->panner()->Changed.connect (*this, (boost::bind (&AudioTimeAxisView::ensure_pan_views, this, false))); + _route->panner()->Changed.connect (*this, boost::bind (&AudioTimeAxisView::ensure_pan_views, this, false), gui_context()); } /* map current state of the route */ diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc index ba08024161..1a32c36b62 100644 --- a/gtk2_ardour/automation_controller.cc +++ b/gtk2_ardour/automation_controller.cc @@ -54,7 +54,7 @@ AutomationController::AutomationController(boost::shared_ptr<AutomationControl> _screen_update_connection = ARDOUR_UI::RapidScreenUpdate.connect ( sigc::mem_fun (*this, &AutomationController::display_effective_value)); - ac->Changed.connect (_changed_connection, sigc::mem_fun(*this, &AutomationController::value_changed)); + ac->Changed.connect (_changed_connection, boost::bind (&AutomationController::value_changed, this), gui_context()); } AutomationController::~AutomationController() diff --git a/gtk2_ardour/automation_line.cc b/gtk2_ardour/automation_line.cc index 726de984a0..8091e3488f 100644 --- a/gtk2_ardour/automation_line.cc +++ b/gtk2_ardour/automation_line.cc @@ -33,6 +33,7 @@ #include "simplerect.h" #include "automation_line.h" #include "control_point.h" +#include "gui_thread.h" #include "rgb_macros.h" #include "ardour_ui.h" #include "public_editor.h" @@ -85,7 +86,7 @@ AutomationLine::AutomationLine (const string& name, TimeAxisView& tv, ArdourCanv line->signal_event().connect (sigc::mem_fun (*this, &AutomationLine::event_handler)); - alist->StateChanged.connect (_state_connection, boost::bind (&AutomationLine::list_changed, this)); + alist->StateChanged.connect (_state_connection, boost::bind (&AutomationLine::list_changed, this), gui_context()); trackview.session()->register_with_memento_command_factory(alist->id(), this); diff --git a/gtk2_ardour/automation_region_view.cc b/gtk2_ardour/automation_region_view.cc index bcb6376027..5e13ee55fd 100644 --- a/gtk2_ardour/automation_region_view.cc +++ b/gtk2_ardour/automation_region_view.cc @@ -22,7 +22,9 @@ #include "ardour/event_type_map.h" #include "ardour/session.h" #include "ardour/source.h" + #include "automation_region_view.h" +#include "gui_thread.h" #include "public_editor.h" #include "i18n.h" @@ -59,7 +61,7 @@ AutomationRegionView::init (Gdk::Color const & basic_color, bool /*wfd*/) set_height (trackview.current_height()); - _region->StateChanged.connect (*this, boost::bind (&RegionView::region_changed, this, _1)); + _region->StateChanged.connect (*this, ui_bind (&RegionView::region_changed, this, _1), gui_context()); set_colors (); diff --git a/gtk2_ardour/automation_streamview.cc b/gtk2_ardour/automation_streamview.cc index 731374eb2d..c8dc0ae3c4 100644 --- a/gtk2_ardour/automation_streamview.cc +++ b/gtk2_ardour/automation_streamview.cc @@ -129,7 +129,7 @@ AutomationStreamView::add_region_view_internal (boost::shared_ptr<Region> region display_region(region_view); /* catch regionview going away */ - region->GoingAway.connect (*this, boost::bind (&AutomationStreamView::remove_region_view, this, boost::weak_ptr<Region>(region))); + region->GoingAway.connect (*this, boost::bind (&AutomationStreamView::remove_region_view, this, boost::weak_ptr<Region>(region)), gui_context()); RegionViewAdded (region_view); diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc index fa507448b4..5454c9991f 100644 --- a/gtk2_ardour/automation_time_axis.cc +++ b/gtk2_ardour/automation_time_axis.cc @@ -28,6 +28,7 @@ #include "ardour_ui.h" #include "automation_time_axis.h" #include "automation_streamview.h" +#include "gui_thread.h" #include "route_time_axis.h" #include "automation_line.h" #include "public_editor.h" @@ -833,7 +834,7 @@ AutomationTimeAxisView::add_line (boost::shared_ptr<AutomationLine> line) assert(!_line); assert(line->the_list() == _control->list()); - _control->alist()->automation_state_changed.connect (automation_connection, boost::bind (&AutomationTimeAxisView::automation_state_changed, this)); + _control->alist()->automation_state_changed.connect (automation_connection, boost::bind (&AutomationTimeAxisView::automation_state_changed, this), gui_context()); _line = line; //_controller = AutomationController::create(_session, line->the_list(), _control); diff --git a/gtk2_ardour/automation_time_axis.h b/gtk2_ardour/automation_time_axis.h index f00d0a24fe..05e0746bf2 100644 --- a/gtk2_ardour/automation_time_axis.h +++ b/gtk2_ardour/automation_time_axis.h @@ -151,7 +151,7 @@ class AutomationTimeAxisView : public TimeAxisView { void set_interpolation (ARDOUR::AutomationList::InterpolationStyle); void interpolation_changed (); - boost::signals2::scoped_connection automation_connection; + PBD::ScopedConnection automation_connection; void update_extra_xml_shown (bool editor_shown); diff --git a/gtk2_ardour/bundle_manager.cc b/gtk2_ardour/bundle_manager.cc index 9b4b2b6bde..a65f5bae35 100644 --- a/gtk2_ardour/bundle_manager.cc +++ b/gtk2_ardour/bundle_manager.cc @@ -24,10 +24,12 @@ #include <gtkmm/table.h> #include <gtkmm/comboboxtext.h> #include <gtkmm/alignment.h> + #include "ardour/session.h" #include "ardour/user_bundle.h" #include "ardour/audioengine.h" #include "bundle_manager.h" +#include "gui_thread.h" #include "i18n.h" #include "utils.h" @@ -395,7 +397,7 @@ BundleManager::add_bundle (boost::shared_ptr<Bundle> b) (*i)[_list_model_columns.name] = u->name (); (*i)[_list_model_columns.bundle] = u; - u->Changed.connect (bundle_connections, boost::bind (&BundleManager::bundle_changed, this, _1, u)); + u->Changed.connect (bundle_connections, ui_bind (&BundleManager::bundle_changed, this, _1, u), gui_context()); } void @@ -420,7 +422,7 @@ BundleManager::bundle_changed (Bundle::Change c, boost::shared_ptr<UserBundle> b } void -BundleManager::row_activated (Gtk::TreeModel::Path const & p, Gtk::TreeViewColumn* c) +BundleManager::row_activated (Gtk::TreeModel::Path const & p, Gtk::TreeViewColumn*) { Gtk::TreeModel::iterator i = _list_model->get_iter (p); if (!i) { diff --git a/gtk2_ardour/crossfade_edit.cc b/gtk2_ardour/crossfade_edit.cc index afb595938d..fd651599ea 100644 --- a/gtk2_ardour/crossfade_edit.cc +++ b/gtk2_ardour/crossfade_edit.cc @@ -291,9 +291,9 @@ CrossfadeEditor::CrossfadeEditor (Session* s, boost::shared_ptr<Crossfade> xf, d curve_select_clicked (In); - xfade->StateChanged.connect (state_connection, boost::bind (&CrossfadeEditor::xfade_changed, this, _1)); + xfade->StateChanged.connect (state_connection, ui_bind (&CrossfadeEditor::xfade_changed, this, _1), gui_context()); - _session->AuditionActive.connect (_session_connections, sigc::mem_fun(*this, &CrossfadeEditor::audition_state_changed)); + _session->AuditionActive.connect (_session_connections, ui_bind (&CrossfadeEditor::audition_state_changed, this, _1), gui_context()); show_all_children(); } @@ -1130,7 +1130,7 @@ CrossfadeEditor::make_waves (boost::shared_ptr<AudioRegion> region, WhichFade wh gdouble yoff = n * ht; - if (region->audio_source(n)->peaks_ready (boost::bind (&CrossfadeEditor::peaks_ready, this, boost::weak_ptr<AudioRegion>(region), which), peaks_ready_connection)) { + if (region->audio_source(n)->peaks_ready (boost::bind (&CrossfadeEditor::peaks_ready, this, boost::weak_ptr<AudioRegion>(region), which), peaks_ready_connection, gui_context())) { WaveView* waveview = new WaveView (*(canvas->root())); waveview->property_data_src() = region.get(); diff --git a/gtk2_ardour/crossfade_view.cc b/gtk2_ardour/crossfade_view.cc index 3a34ace7fa..41134e5096 100644 --- a/gtk2_ardour/crossfade_view.cc +++ b/gtk2_ardour/crossfade_view.cc @@ -25,6 +25,7 @@ #include "canvas-simplerect.h" #include "canvas-curve.h" #include "crossfade_view.h" +#include "gui_thread.h" #include "rgb_macros.h" #include "audio_time_axis.h" #include "public_editor.h" @@ -83,7 +84,7 @@ CrossfadeView::CrossfadeView (ArdourCanvas::Group *parent, crossfade_changed (Change (~0)); - crossfade->StateChanged.connect (*this, sigc::mem_fun(*this, &CrossfadeView::crossfade_changed)); + crossfade->StateChanged.connect (*this, ui_bind (&CrossfadeView::crossfade_changed, this, _1), gui_context()); ColorsChanged.connect (sigc::mem_fun (*this, &CrossfadeView::color_handler)); } diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 9bf2ccbc5d..8b98273229 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -627,7 +627,7 @@ Editor::Editor () _playlist_selector = new PlaylistSelector(); _playlist_selector->signal_delete_event().connect (sigc::bind (sigc::ptr_fun (just_hide_it), static_cast<Window *> (_playlist_selector))); - RegionView::RegionViewGoingAway.connect (*this, boost::bind (&Editor::catch_vanishing_regionview, this, _1)); + RegionView::RegionViewGoingAway.connect (*this, ui_bind (&Editor::catch_vanishing_regionview, this, _1), gui_context()); /* nudge stuff */ @@ -677,14 +677,17 @@ Editor::Editor () /* allow external control surfaces/protocols to do various things */ - ControlProtocol::ZoomToSession.connect (*this, boost::bind (&Editor::temporal_zoom_session, this)); - ControlProtocol::ZoomIn.connect (*this, boost::bind (&Editor::temporal_zoom_step, this, false)); - ControlProtocol::ZoomOut.connect (*this, boost::bind (&Editor::temporal_zoom_step, this, true)); - ControlProtocol::ScrollTimeline.connect (*this, boost::bind (&Editor::control_scroll, this, _1)); - BasicUI::AccessAction.connect (*this, boost::bind (&Editor::access_action, this, _1, _2)); - Session::AskAboutPlaylistDeletion.connect (*this, boost::bind (&Editor::playlist_deletion_dialog, this, _1)); + ControlProtocol::ZoomToSession.connect (*this, boost::bind (&Editor::temporal_zoom_session, this), gui_context()); + ControlProtocol::ZoomIn.connect (*this, boost::bind (&Editor::temporal_zoom_step, this, false), gui_context()); + ControlProtocol::ZoomOut.connect (*this, boost::bind (&Editor::temporal_zoom_step, this, true), gui_context()); + ControlProtocol::ScrollTimeline.connect (*this, ui_bind (&Editor::control_scroll, this, _1), gui_context()); + BasicUI::AccessAction.connect (*this, ui_bind (&Editor::access_action, this, _1, _2), gui_context()); + + /* problematic: has to return a value and thus cannot be x-thread */ + + Session::AskAboutPlaylistDeletion.connect_same_thread (*this, boost::bind (&Editor::playlist_deletion_dialog, this, _1)); - Config->ParameterChanged.connect (*this, boost::bind (&Editor::parameter_changed, this, _1)); + Config->ParameterChanged.connect (*this, ui_bind (&Editor::parameter_changed, this, _1), gui_context()); _last_normalization_value = 0; @@ -1081,22 +1084,22 @@ Editor::set_session (Session *t) but use Gtkmm2ext::UI::instance()->call_slot(); */ - _session->TransportStateChange.connect (_session_connections, boost::bind (&Editor::map_transport_state, this)); - _session->PositionChanged.connect (_session_connections, boost::bind (&Editor::map_position_change, this, _1)); - _session->RouteAdded.connect (_session_connections, boost::bind (&Editor::handle_new_route, this, _1)); - _session->DurationChanged.connect (_session_connections, boost::bind (&Editor::handle_new_duration, this)); - _session->DirtyChanged.connect (_session_connections, boost::bind (&Editor::update_title, this)); - _session->TimecodeOffsetChanged.connect (_session_connections, boost::bind (&Editor::update_just_timecode, this)); - _session->tempo_map().StateChanged.connect (_session_connections, boost::bind (&Editor::tempo_map_changed, this, _1)); - _session->Located.connect (_session_connections, boost::bind (&Editor::located, this)); - _session->config.ParameterChanged.connect (_session_connections, boost::bind (&Editor::parameter_changed, this, _1)); - _session->StateSaved.connect (_session_connections, boost::bind (&Editor::session_state_saved, this, _1)); - _session->locations()->added.connect (_session_connections, sigc::mem_fun(*this, &Editor::add_new_location)); - _session->locations()->removed.connect (_session_connections, sigc::mem_fun(*this, &Editor::location_gone)); - _session->locations()->changed.connect (_session_connections, sigc::mem_fun(*this, &Editor::refresh_location_display)); - _session->locations()->StateChanged.connect (_session_connections, sigc::mem_fun(*this, &Editor::refresh_location_display_s)); - _session->locations()->end_location()->changed.connect (_session_connections, sigc::mem_fun(*this, &Editor::end_location_changed)); - _session->history().Changed.connect (_session_connections, boost::bind (&Editor::history_changed, this)); + _session->TransportStateChange.connect (_session_connections, boost::bind (&Editor::map_transport_state, this), gui_context()); + _session->PositionChanged.connect (_session_connections, ui_bind (&Editor::map_position_change, this, _1), gui_context()); + _session->RouteAdded.connect (_session_connections, ui_bind (&Editor::handle_new_route, this, _1), gui_context()); + _session->DurationChanged.connect (_session_connections, boost::bind (&Editor::handle_new_duration, this), gui_context()); + _session->DirtyChanged.connect (_session_connections, boost::bind (&Editor::update_title, this), gui_context()); + _session->TimecodeOffsetChanged.connect (_session_connections, boost::bind (&Editor::update_just_timecode, this), gui_context()); + _session->tempo_map().StateChanged.connect (_session_connections, ui_bind (&Editor::tempo_map_changed, this, _1), gui_context()); + _session->Located.connect (_session_connections, boost::bind (&Editor::located, this), gui_context()); + _session->config.ParameterChanged.connect (_session_connections, ui_bind (&Editor::parameter_changed, this, _1), gui_context()); + _session->StateSaved.connect (_session_connections, ui_bind (&Editor::session_state_saved, this, _1), gui_context()); + _session->locations()->added.connect (_session_connections, ui_bind (&Editor::add_new_location, this, _1), gui_context()); + _session->locations()->removed.connect (_session_connections, ui_bind (&Editor::location_gone, this, _1), gui_context()); + _session->locations()->changed.connect (_session_connections, boost::bind (&Editor::refresh_location_display, this), gui_context()); + _session->locations()->StateChanged.connect (_session_connections, ui_bind (&Editor::refresh_location_display_s, this, _1), gui_context()); + _session->locations()->end_location()->changed.connect (_session_connections, ui_bind (&Editor::end_location_changed, this, _1), gui_context()); + _session->history().Changed.connect (_session_connections, boost::bind (&Editor::history_changed, this), gui_context()); if (Profile->get_sae()) { BBT_Time bbt; @@ -4802,7 +4805,7 @@ Editor::handle_new_route (RouteList& routes) rtv->view()->RegionViewAdded.connect (sigc::mem_fun (*this, &Editor::region_view_added)); rtv->view()->HeightChanged.connect (sigc::mem_fun (*this, &Editor::streamview_height_changed)); - rtv->GoingAway.connect (*this, boost::bind (&Editor::remove_route, this, rtv)); + rtv->GoingAway.connect (*this, boost::bind (&Editor::remove_route, this, rtv), gui_context()); } _routes->routes_added (new_views); diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 4f864309f9..907abfc348 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -30,6 +30,7 @@ #include "audio_region_view.h" #include "midi_region_view.h" #include "ardour_ui.h" +#include "gui_thread.h" #include "control_point.h" #include "utils.h" #include "region_gain_line.h" @@ -237,7 +238,7 @@ RegionDrag::RegionDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<Re _primary (p), _views (v) { - RegionView::RegionViewGoingAway.connect (death_connection, boost::bind (&RegionDrag::region_going_away, this, _1)); + RegionView::RegionViewGoingAway.connect (death_connection, ui_bind (&RegionDrag::region_going_away, this, _1), gui_context()); } void diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index 170c9a8080..95b22221a3 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -160,7 +160,7 @@ protected: private: void region_going_away (RegionView *); - boost::signals2::scoped_connection death_connection; + PBD::ScopedConnection death_connection; }; diff --git a/gtk2_ardour/editor_imageframe.cc b/gtk2_ardour/editor_imageframe.cc index 7f499c0c6f..4b0601fcea 100644 --- a/gtk2_ardour/editor_imageframe.cc +++ b/gtk2_ardour/editor_imageframe.cc @@ -41,6 +41,7 @@ #include "imageframe_socket_handler.h" #include "ardour_image_compositor_socket.h" #include "public_editor.h" +#include "gui_thread.h" using namespace Gtk; using namespace PBD; @@ -1092,7 +1093,7 @@ Editor::handle_new_imageframe_time_axis_view(const string & track_name, void* sr row[route_display_columns.tv] = iftav; route_list_display.get_selection()->select (row); - iftav->GoingAway.connect (*this, boost::bind (&Editor::remove_route, this, (TimeAxisView*)iftav)); + iftav->GoingAway.connect (*this, boost::bind (&Editor::remove_route, this, (TimeAxisView*)iftav), gui_context()); iftav->gui_changed.connect(sigc::mem_fun(*this, &Editor::handle_gui_changes)) ; } @@ -1109,7 +1110,7 @@ Editor::handle_new_imageframe_marker_time_axis_view(const string & track_name, T row[route_display_columns.tv] = mta; route_list_display.get_selection()->select (row); - mta->GoingAway.connect (*this, boost::bind (&Editor::remove_route, this, (TimeAxisView*)mta)); + mta->GoingAway.connect (*this, boost::bind (&Editor::remove_route, this, (TimeAxisView*)mta), gui_context()); } diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc index dbee2fb9d2..79fd056126 100644 --- a/gtk2_ardour/editor_markers.cc +++ b/gtk2_ardour/editor_markers.cc @@ -123,11 +123,11 @@ Editor::add_new_location (Location *location) lam->show (); } - location->start_changed.connect (*this, boost::bind (&Editor::location_changed, this, _1)); - location->end_changed.connect (*this, boost::bind (&Editor::location_changed, this, _1)); - location->changed.connect (*this, boost::bind (&Editor::location_changed, this, _1)); - location->name_changed.connect (*this, boost::bind (&Editor::location_changed, this, _1)); - location->FlagsChanged.connect (*this, boost::bind (&Editor::location_flags_changed, this, _1, _2)); + location->start_changed.connect (*this, ui_bind (&Editor::location_changed, this, _1), gui_context()); + location->end_changed.connect (*this, ui_bind (&Editor::location_changed, this, _1), gui_context()); + location->changed.connect (*this, ui_bind (&Editor::location_changed, this, _1), gui_context()); + location->name_changed.connect (*this, ui_bind (&Editor::location_changed, this, _1), gui_context()); + location->FlagsChanged.connect (*this, ui_bind (&Editor::location_flags_changed, this, _1, _2), gui_context()); pair<Location*,LocationMarkers*> newpair; diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc index 6cb6046006..64d9e97ac6 100644 --- a/gtk2_ardour/editor_mixer.cc +++ b/gtk2_ardour/editor_mixer.cc @@ -35,6 +35,7 @@ #include "editor_routes.h" #include "editor_route_groups.h" #include "editor_regions.h" +#include "gui_thread.h" #include "i18n.h" @@ -168,7 +169,7 @@ Editor::create_editor_mixer () _session, false); current_mixer_strip->Hiding.connect (sigc::mem_fun(*this, &Editor::current_mixer_strip_hidden)); - current_mixer_strip->GoingAway.connect (*this, boost::bind (&Editor::current_mixer_strip_removed, this)); + current_mixer_strip->GoingAway.connect (*this, boost::bind (&Editor::current_mixer_strip_removed, this), gui_context()); #ifdef GTKOSX current_mixer_strip->WidthChanged.connect (sigc::mem_fun(*this, &Editor::ensure_all_elements_drawn)); #endif diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc index 26ae2f6f50..490f6991e3 100644 --- a/gtk2_ardour/editor_regions.cc +++ b/gtk2_ardour/editor_regions.cc @@ -125,7 +125,7 @@ EditorRegions::EditorRegions (Editor* e) //ARDOUR_UI::instance()->secondary_clock.mode_changed.connect (sigc::mem_fun(*this, &Editor::redisplay_regions)); ARDOUR_UI::instance()->secondary_clock.mode_changed.connect (sigc::mem_fun(*this, &EditorRegions::update_all_rows)); - ARDOUR::Region::RegionPropertyChanged.connect (region_property_connection, sigc::mem_fun(*this, &EditorRegions::update_row)); + ARDOUR::Region::RegionPropertyChanged.connect (region_property_connection, ui_bind (&EditorRegions::update_row, this, _1), gui_context()); } @@ -135,9 +135,9 @@ EditorRegions::set_session (ARDOUR::Session* s) EditorComponent::set_session (s); if (_session) { - _session->RegionsAdded.connect (_session_connections, boost::bind (&EditorRegions::handle_new_regions, this, _1)); - _session->RegionRemoved.connect (_session_connections, boost::bind (&EditorRegions::handle_region_removed, this, _1)); - _session->RegionHiddenChange.connect (_session_connections, boost::bind (&EditorRegions::region_hidden, this, _1)); + _session->RegionsAdded.connect (_session_connections, ui_bind (&EditorRegions::handle_new_regions, this, _1), gui_context()); + _session->RegionRemoved.connect (_session_connections, ui_bind (&EditorRegions::handle_region_removed, this, _1), gui_context()); + _session->RegionHiddenChange.connect (_session_connections, ui_bind (&EditorRegions::region_hidden, this, _1), gui_context()); } redisplay (); diff --git a/gtk2_ardour/editor_route_groups.cc b/gtk2_ardour/editor_route_groups.cc index c52817a15a..9cbb2725c2 100644 --- a/gtk2_ardour/editor_route_groups.cc +++ b/gtk2_ardour/editor_route_groups.cc @@ -574,7 +574,7 @@ EditorRouteGroups::add (RouteGroup* group) focus = true; } - group->FlagsChanged.connect (flags_connection, boost::bind (&EditorRouteGroups::flags_changed, this, _1, group)); + group->FlagsChanged.connect (flags_connection, ui_bind (&EditorRouteGroups::flags_changed, this, _1, group), gui_context()); if (focus) { TreeViewColumn* col = _display.get_column (0); @@ -668,8 +668,8 @@ EditorRouteGroups::set_session (Session* s) EditorComponent::set_session (s); if (_session) { - _session->route_group_added.connect (_session_connections, boost::bind (&EditorRouteGroups::add, this, _1)); - _session->route_group_removed.connect (_session_connections, boost::bind (&EditorRouteGroups::groups_changed, this)); + _session->route_group_added.connect (_session_connections, ui_bind (&EditorRouteGroups::add, this, _1), gui_context()); + _session->route_group_removed.connect (_session_connections, boost::bind (&EditorRouteGroups::groups_changed, this), gui_context()); } groups_changed (); diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc index 3ef66161fb..b18d35a5e3 100644 --- a/gtk2_ardour/editor_routes.cc +++ b/gtk2_ardour/editor_routes.cc @@ -150,7 +150,7 @@ EditorRoutes::EditorRoutes (Editor* e) _model->signal_rows_reordered().connect (sigc::mem_fun (*this, &EditorRoutes::reordered)); _display.signal_button_press_event().connect (sigc::mem_fun (*this, &EditorRoutes::button_press), false); - Route::SyncOrderKeys.connect (*this, (sigc::mem_fun (*this, &EditorRoutes::sync_order_keys))); + Route::SyncOrderKeys.connect (*this, ui_bind (&EditorRoutes::sync_order_keys, this, _1), gui_context()); } void @@ -161,7 +161,7 @@ EditorRoutes::set_session (Session* s) initial_display (); if (_session) { - _session->SoloChanged.connect (*this, (sigc::mem_fun (*this, &EditorRoutes::solo_changed_so_update_mute))); + _session->SoloChanged.connect (*this, boost::bind (&EditorRoutes::solo_changed_so_update_mute, this), gui_context()); } } @@ -383,18 +383,18 @@ EditorRoutes::routes_added (list<RouteTimeAxisView*> routes) boost::weak_ptr<Route> wr ((*x)->route()); - (*x)->route()->gui_changed.connect (*this, boost::bind (&EditorRoutes::handle_gui_changes, this, _1, _2)); - (*x)->route()->NameChanged.connect (*this, boost::bind (&EditorRoutes::route_name_changed, this, wr)); - (*x)->GoingAway.connect (*this, boost::bind (&EditorRoutes::route_removed, this, *x)); + (*x)->route()->gui_changed.connect (*this, ui_bind (&EditorRoutes::handle_gui_changes, this, _1, _2), gui_context()); + (*x)->route()->NameChanged.connect (*this, boost::bind (&EditorRoutes::route_name_changed, this, wr), gui_context()); + (*x)->GoingAway.connect (*this, boost::bind (&EditorRoutes::route_removed, this, *x), gui_context()); if ((*x)->is_track()) { boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> ((*x)->route()); - t->diskstream()->RecordEnableChanged.connect (*this, boost::bind (&EditorRoutes::update_rec_display, this)); + t->diskstream()->RecordEnableChanged.connect (*this, boost::bind (&EditorRoutes::update_rec_display, this), gui_context()); } - (*x)->route()->mute_changed.connect (*this, boost::bind (&EditorRoutes::update_mute_display, this)); - (*x)->route()->solo_changed.connect (*this, boost::bind (&EditorRoutes::update_solo_display, this)); - (*x)->route()->solo_isolated_changed.connect (*this, boost::bind (&EditorRoutes::update_solo_isolate_display, this)); + (*x)->route()->mute_changed.connect (*this, boost::bind (&EditorRoutes::update_mute_display, this), gui_context()); + (*x)->route()->solo_changed.connect (*this, boost::bind (&EditorRoutes::update_solo_display, this), gui_context()); + (*x)->route()->solo_isolated_changed.connect (*this, boost::bind (&EditorRoutes::update_solo_isolate_display, this), gui_context()); } update_rec_display (); diff --git a/gtk2_ardour/editor_summary.cc b/gtk2_ardour/editor_summary.cc index 93be5afd13..aae814d8e5 100644 --- a/gtk2_ardour/editor_summary.cc +++ b/gtk2_ardour/editor_summary.cc @@ -47,8 +47,8 @@ EditorSummary::EditorSummary (Editor* e) _zoom_dragging (false) { - Region::RegionPropertyChanged.connect (region_property_connection, boost::bind (&CairoWidget::set_dirty, this)); - _editor->playhead_cursor->PositionChanged.connect (position_connection, boost::bind (&EditorSummary::playhead_position_changed, this, _1)); + Region::RegionPropertyChanged.connect (region_property_connection, boost::bind (&CairoWidget::set_dirty, this), gui_context()); + _editor->playhead_cursor->PositionChanged.connect (position_connection, ui_bind (&EditorSummary::playhead_position_changed, this, _1), gui_context()); } /** Connect to a session. @@ -62,9 +62,9 @@ EditorSummary::set_session (Session* s) set_dirty (); if (_session) { - _session->RegionRemoved.connect (_session_connections, boost::bind (&EditorSummary::set_dirty, this)); - _session->StartTimeChanged.connect (_session_connections, boost::bind (&EditorSummary::set_dirty, this)); - _session->EndTimeChanged.connect (_session_connections, boost::bind (&EditorSummary::set_dirty, this)); + _session->RegionRemoved.connect (_session_connections, boost::bind (&EditorSummary::set_dirty, this), gui_context()); + _session->StartTimeChanged.connect (_session_connections, boost::bind (&EditorSummary::set_dirty, this), gui_context()); + _session->EndTimeChanged.connect (_session_connections, boost::bind (&EditorSummary::set_dirty, this), gui_context()); } } diff --git a/gtk2_ardour/export_dialog.cc b/gtk2_ardour/export_dialog.cc index 84202d57ea..0f5c6a4551 100644 --- a/gtk2_ardour/export_dialog.cc +++ b/gtk2_ardour/export_dialog.cc @@ -18,7 +18,6 @@ */ -#include "export_dialog.h" #include <sigc++/signal.h> @@ -27,6 +26,9 @@ #include "ardour/export_status.h" #include "ardour/export_handler.h" +#include "export_dialog.h" +#include "gui_thread.h" + using namespace ARDOUR; using namespace PBD; @@ -86,7 +88,8 @@ ExportDialog::set_session (ARDOUR::Session* s) timespan_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings)); channel_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings)); file_notebook->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings)); - status->Aborting.connect (abort_connection, sigc::mem_fun (*this, &ExportDialog::notify_errors)); + + status->Aborting.connect (abort_connection, boost::bind (&ExportDialog::notify_errors, this), gui_context()); update_warnings (); } diff --git a/gtk2_ardour/export_file_notebook.cc b/gtk2_ardour/export_file_notebook.cc index 5961715d83..c785d14be1 100644 --- a/gtk2_ardour/export_file_notebook.cc +++ b/gtk2_ardour/export_file_notebook.cc @@ -22,6 +22,7 @@ #include "ardour/export_format_specification.h" +#include "gui_thread.h" #include "utils.h" #include "i18n.h" @@ -196,7 +197,7 @@ ExportFileNotebook::FilePage::FilePage (Session * s, ManagerPtr profile_manager, tab_close_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*parent, &ExportFileNotebook::remove_file_page), this)); - profile_manager->FormatListChanged.connect (format_connection, boost::bind (&ExportFormatSelector::update_format_list, &format_selector)); + profile_manager->FormatListChanged.connect (format_connection, boost::bind (&ExportFormatSelector::update_format_list, &format_selector), gui_context()); format_selector.FormatEdited.connect (sigc::mem_fun (*this, &ExportFileNotebook::FilePage::save_format_to_manager)); format_selector.FormatRemoved.connect (sigc::mem_fun (*profile_manager, &ExportProfileManager::remove_format_profile)); diff --git a/gtk2_ardour/export_format_dialog.cc b/gtk2_ardour/export_format_dialog.cc index 1c93115da3..1b0a511ac3 100644 --- a/gtk2_ardour/export_format_dialog.cc +++ b/gtk2_ardour/export_format_dialog.cc @@ -18,11 +18,11 @@ */ -#include "export_format_dialog.h" - #include "ardour/session.h" #include "ardour/export_format_specification.h" +#include "export_format_dialog.h" +#include "gui_thread.h" #include "i18n.h" using namespace ARDOUR; @@ -127,7 +127,7 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) : close_button = add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_APPLY); close_button->set_sensitive (false); close_button->signal_clicked().connect (sigc::mem_fun (*this, &ExportFormatDialog::end_dialog)); - manager.CompleteChanged.connect (*this, sigc::mem_fun (close_button, &Gtk::Button::set_sensitive)); + manager.CompleteChanged.connect (*this, ui_bind (&Gtk::Button::set_sensitive, close_button, _1), gui_context()); /* Load state before hooking up the rest of the signals */ @@ -319,7 +319,7 @@ ExportFormatDialog::init_format_table () row[compatibility_cols.label] = (*it)->name(); WeakCompatPtr ptr (*it); - (*it)->SelectChanged.connect (*this, boost::bind (&ExportFormatDialog::change_compatibility_selection, this, _1, ptr)); + (*it)->SelectChanged.connect (*this, ui_bind (&ExportFormatDialog::change_compatibility_selection, this, _1, ptr), gui_context()); } compatibility_view.append_column_editable ("", compatibility_cols.selected); @@ -347,8 +347,8 @@ ExportFormatDialog::init_format_table () row[quality_cols.label] = (*it)->name(); WeakQualityPtr ptr (*it); - (*it)->SelectChanged.connect (*this, boost::bind (&ExportFormatDialog::change_quality_selection, this, _1, ptr)); - (*it)->CompatibleChanged.connect (*this, boost::bind (&ExportFormatDialog::change_quality_compatibility, this, _1, ptr)); + (*it)->SelectChanged.connect (*this, ui_bind (&ExportFormatDialog::change_quality_selection, this, _1, ptr), gui_context()); + (*it)->CompatibleChanged.connect (*this, ui_bind (&ExportFormatDialog::change_quality_compatibility, this, _1, ptr), gui_context()); } quality_view.append_column ("", quality_cols.label); @@ -369,19 +369,19 @@ ExportFormatDialog::init_format_table () row[format_cols.label] = (*it)->name(); WeakFormatPtr ptr (*it); - (*it)->SelectChanged.connect (*this, boost::bind (&ExportFormatDialog::change_format_selection, this, _1, ptr)); - (*it)->CompatibleChanged.connect (*this, boost::bind (&ExportFormatDialog::change_format_compatibility, this, _1, ptr)); + (*it)->SelectChanged.connect (*this, ui_bind (&ExportFormatDialog::change_format_selection, this, _1, ptr), gui_context()); + (*it)->CompatibleChanged.connect (*this, ui_bind (&ExportFormatDialog::change_format_compatibility, this, _1, ptr), gui_context()); /* Encoding options */ boost::shared_ptr<HasSampleFormat> hsf; if (hsf = boost::dynamic_pointer_cast<HasSampleFormat> (*it)) { - hsf->SampleFormatSelectChanged.connect (*this, boost::bind (&ExportFormatDialog::change_sample_format_selection, this, _1, _2)); - hsf->SampleFormatCompatibleChanged.connect (*this, boost::bind (&ExportFormatDialog::change_sample_format_compatibility, this, _1, _2)); + hsf->SampleFormatSelectChanged.connect (*this, ui_bind (&ExportFormatDialog::change_sample_format_selection, this, _1, _2), gui_context()); + hsf->SampleFormatCompatibleChanged.connect (*this, ui_bind (&ExportFormatDialog::change_sample_format_compatibility, this, _1, _2), gui_context()); - hsf->DitherTypeSelectChanged.connect (*this, boost::bind (&ExportFormatDialog::change_dither_type_selection, this, _1, _2)); - hsf->DitherTypeCompatibleChanged.connect (*this, boost::bind (&ExportFormatDialog::change_dither_type_compatibility, this, _1, _2)); + hsf->DitherTypeSelectChanged.connect (*this, ui_bind (&ExportFormatDialog::change_dither_type_selection, this, _1, _2), gui_context()); + hsf->DitherTypeCompatibleChanged.connect (*this, ui_bind (&ExportFormatDialog::change_dither_type_compatibility, this, _1, _2), gui_context()); } } @@ -403,8 +403,8 @@ ExportFormatDialog::init_format_table () row[sample_rate_cols.label] = (*it)->name(); WeakSampleRatePtr ptr (*it); - (*it)->SelectChanged.connect (*this, boost::bind (&ExportFormatDialog::change_sample_rate_selection, this, _1, ptr)); - (*it)->CompatibleChanged.connect (*this, boost::bind (&ExportFormatDialog::change_sample_rate_compatibility, this, _1, ptr)); + (*it)->SelectChanged.connect (*this, ui_bind (&ExportFormatDialog::change_sample_rate_selection, this, _1, ptr), gui_context()); + (*it)->CompatibleChanged.connect (*this, ui_bind (&ExportFormatDialog::change_sample_rate_compatibility, this, _1, ptr), gui_context()); } sample_rate_view.append_column ("", sample_rate_cols.label); diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 3c3b70c7cf..961ceb6a4a 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -226,13 +226,13 @@ GainMeterBase::set_controls (boost::shared_ptr<Route> r, boost::shared_ptr<AutomationControl> gc = amp->gain_control(); - gc->alist()->automation_state_changed.connect (model_connections, boost::bind (&GainMeter::gain_automation_state_changed, this)); - gc->alist()->automation_style_changed.connect (model_connections, boost::bind (&GainMeter::gain_automation_style_changed, this)); + gc->alist()->automation_state_changed.connect (model_connections, boost::bind (&GainMeter::gain_automation_state_changed, this), gui_context()); + gc->alist()->automation_style_changed.connect (model_connections, boost::bind (&GainMeter::gain_automation_style_changed, this), gui_context()); gain_automation_state_changed (); } - amp->gain_control()->Changed.connect (model_connections, boost::bind (&GainMeterBase::gain_changed, this)); + amp->gain_control()->Changed.connect (model_connections, boost::bind (&GainMeterBase::gain_changed, this), gui_context()); gain_changed (); show_gain (); diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc index 1865c1e0a2..3d59910ff4 100644 --- a/gtk2_ardour/generic_pluginui.cc +++ b/gtk2_ardour/generic_pluginui.cc @@ -125,7 +125,7 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol main_contents.pack_start (hpacker, false, false); } - pi->ActiveChanged.connect (active_connection, boost::bind (&GenericPluginUI::processor_active_changed, this, boost::weak_ptr<Processor>(pi))); + pi->ActiveChanged.connect (active_connection, boost::bind (&GenericPluginUI::processor_active_changed, this, boost::weak_ptr<Processor>(pi)), gui_context()); bypass_button.set_active (!pi->active()); @@ -420,7 +420,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat //control_ui->combo->set_value_in_list(true, false); set_popdown_strings (*control_ui->combo, setup_scale_values(port_index, control_ui)); control_ui->combo->signal_changed().connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::control_combo_changed), control_ui)); - mcontrol->Changed.connect (control_connections, boost::bind (&GenericPluginUI::parameter_changed, this, control_ui)); + mcontrol->Changed.connect (control_connections, boost::bind (&GenericPluginUI::parameter_changed, this, control_ui), gui_context()); control_ui->pack_start(control_ui->label, true, true); control_ui->pack_start(*control_ui->combo, false, true); @@ -441,7 +441,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat //control_ui->combo->set_value_in_list(true, false); set_popdown_strings (*control_ui->combo, setup_scale_values(port_index, control_ui)); control_ui->combo->signal_changed().connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::control_combo_changed), control_ui)); - mcontrol->Changed.connect (control_connections, boost::bind (&GenericPluginUI::parameter_changed, this, control_ui)); + mcontrol->Changed.connect (control_connections, boost::bind (&GenericPluginUI::parameter_changed, this, control_ui), gui_context()); control_ui->pack_start(control_ui->label, true, true); control_ui->pack_start(*control_ui->combo, false, true); @@ -466,7 +466,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat // control_ui->pack_start (control_ui->automate_button, false, false); control_ui->button->signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::control_port_toggled), control_ui)); - mcontrol->Changed.connect (control_connections, boost::bind (&GenericPluginUI::toggle_parameter_changed, this, control_ui)); + mcontrol->Changed.connect (control_connections, boost::bind (&GenericPluginUI::toggle_parameter_changed, this, control_ui), gui_context()); if (plugin->get_parameter (port_index) > 0.5){ control_ui->button->set_active(true); @@ -542,8 +542,8 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat automation_state_changed (control_ui); - mcontrol->Changed.connect (control_connections, boost::bind (&GenericPluginUI::parameter_changed, this, control_ui)); - mcontrol->alist()->automation_state_changed.connect (control_connections, boost::bind (&GenericPluginUI::automation_state_changed, this, control_ui)); + mcontrol->Changed.connect (control_connections, boost::bind (&GenericPluginUI::parameter_changed, this, control_ui), gui_context()); + mcontrol->alist()->automation_state_changed.connect (control_connections, boost::bind (&GenericPluginUI::automation_state_changed, this, control_ui), gui_context()); } else if (plugin->parameter_is_output (port_index)) { @@ -592,7 +592,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat output_controls.push_back (control_ui); } - mcontrol->Changed.connect (control_connections, boost::bind (&GenericPluginUI::parameter_changed, this, control_ui)); + mcontrol->Changed.connect (control_connections, boost::bind (&GenericPluginUI::parameter_changed, this, control_ui), gui_context()); return control_ui; } diff --git a/gtk2_ardour/group_tabs.cc b/gtk2_ardour/group_tabs.cc index 17cec93f82..8e7b8f0607 100644 --- a/gtk2_ardour/group_tabs.cc +++ b/gtk2_ardour/group_tabs.cc @@ -21,6 +21,8 @@ #include "ardour/session.h" #include "ardour/route_group.h" #include "ardour/route.h" + +#include "gui_thread.h" #include "route_group_dialog.h" #include "group_tabs.h" #include "keyboard.h" @@ -45,7 +47,7 @@ GroupTabs::set_session (Session* s) EditorComponent::set_session (s); if (_session) { - _session->RouteGroupChanged.connect (_session_connections, boost::bind (&GroupTabs::set_dirty, this)); + _session->RouteGroupChanged.connect (_session_connections, boost::bind (&GroupTabs::set_dirty, this), gui_context()); } } diff --git a/gtk2_ardour/gui_thread.h b/gtk2_ardour/gui_thread.h index f932c603ac..edea9b9d21 100644 --- a/gtk2_ardour/gui_thread.h +++ b/gtk2_ardour/gui_thread.h @@ -22,6 +22,7 @@ #include <gtkmm2ext/gtk_ui.h> #include <boost/bind.hpp> +#include <boost/bind/protect.hpp> #define ENSURE_GUI_THREAD(obj,method, ...) \ if (!Gtkmm2ext::UI::instance()->caller_is_self()) { \ @@ -29,4 +30,7 @@ return;\ } +#define gui_context() Gtkmm2ext::UI::instance() /* a UICallback-derived object that specifies the event loop for GUI signal handling */ +#define ui_bind(f, ...) boost::protect (boost::bind (f, __VA_ARGS__)) + #endif /* __ardour_gtk_gui_thread_h__ */ diff --git a/gtk2_ardour/imageframe_time_axis.cc b/gtk2_ardour/imageframe_time_axis.cc index 9dbcb31392..270dd01454 100644 --- a/gtk2_ardour/imageframe_time_axis.cc +++ b/gtk2_ardour/imageframe_time_axis.cc @@ -322,7 +322,7 @@ ImageFrameTimeAxis::add_marker_time_axis(MarkerTimeAxis* marker_track, void* src else { marker_time_axis_list.push_back(marker_track) ; - marker_track->GoingAway.connect (*this, boost::bind (&ImageFrameTimeAxis::remove_time_axis_view, this, marker_track, (void*)this)); + marker_track->GoingAway.connect (*this, boost::bind (&ImageFrameTimeAxis::remove_time_axis_view, this, marker_track, (void*)this), gui_context()); MarkerTimeAxisAdded(marker_track, src) ; /* EMIT_SIGNAL */ ret = true ; diff --git a/gtk2_ardour/imageframe_time_axis_group.cc b/gtk2_ardour/imageframe_time_axis_group.cc index 4c33d73dfc..a555d5254b 100644 --- a/gtk2_ardour/imageframe_time_axis_group.cc +++ b/gtk2_ardour/imageframe_time_axis_group.cc @@ -216,7 +216,7 @@ ImageFrameTimeAxisGroup::add_imageframe_item(const string & frame_id, nframes_t imageframe_views.push_front(ifv) ; - ifv->GoingAway.connect (*this, boost::bind (&ImageFrameTimeAxisGroup::remove_imageframe_item, this, (void*)this)); + ifv->GoingAway.connect (*this, boost::bind (&ImageFrameTimeAxisGroup::remove_imageframe_item, this, (void*)this), gui_context()); ImageFrameAdded(ifv, src) ; /* EMIT_SIGNAL */ } diff --git a/gtk2_ardour/imageframe_time_axis_view.cc b/gtk2_ardour/imageframe_time_axis_view.cc index 05dda6bc8e..5c00bc1e59 100644 --- a/gtk2_ardour/imageframe_time_axis_view.cc +++ b/gtk2_ardour/imageframe_time_axis_view.cc @@ -214,7 +214,7 @@ ImageFrameTimeAxisView::add_imageframe_group(std::string group_id, void* src) imageframe_groups.push_front(iftag) ; - iftag->GoingAway.connect (*this, boost::bind (&ImageFrameTimeAxisView::remove_imageframe_group, this, iftag, (void*)this)); + iftag->GoingAway.connect (*this, boost::bind (&ImageFrameTimeAxisView::remove_imageframe_group, this, iftag, (void*)this), gui_context()); ImageFrameGroupAdded(iftag, src) ; /* EMIT_SIGNAL */ } diff --git a/gtk2_ardour/imageframe_view.cc b/gtk2_ardour/imageframe_view.cc index 273ac30b99..1d8f5ceab7 100644 --- a/gtk2_ardour/imageframe_view.cc +++ b/gtk2_ardour/imageframe_view.cc @@ -287,7 +287,7 @@ ImageFrameView::add_marker_view_item(MarkerView* item, void* src) { marker_view_list.push_back(item) ; - item->GoingAway.connect (*this, boost::bind (&ImageFrameView::remove_marker_view_item, this, (void*)this)); + item->GoingAway.connect (*this, boost::bind (&ImageFrameView::remove_marker_view_item, this, (void*)this), gui_context()); MarkerViewAdded(item, src) ; /* EMIT_SIGNAL */ } diff --git a/gtk2_ardour/io_selector.cc b/gtk2_ardour/io_selector.cc index e038035a95..bc8f3b8890 100644 --- a/gtk2_ardour/io_selector.cc +++ b/gtk2_ardour/io_selector.cc @@ -272,7 +272,7 @@ PortInsertWindow::PortInsertWindow (ARDOUR::Session* sess, boost::shared_ptr<ARD signal_delete_event().connect (sigc::mem_fun (*this, &PortInsertWindow::wm_delete), false); - pi->GoingAway.connect (going_away_connection, boost::bind (&PortInsertWindow::plugin_going_away, this)); + pi->GoingAway.connect (going_away_connection, boost::bind (&PortInsertWindow::plugin_going_away, this), gui_context()); } bool diff --git a/gtk2_ardour/io_selector.h b/gtk2_ardour/io_selector.h index 63e02a2a75..a4545dbfc4 100644 --- a/gtk2_ardour/io_selector.h +++ b/gtk2_ardour/io_selector.h @@ -122,7 +122,7 @@ class PortInsertWindow : public ArdourDialog void accept (); void plugin_going_away (); - boost::signals2::scoped_connection going_away_connection; + PBD::ScopedConnection going_away_connection; bool wm_delete (GdkEventAny*); }; diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index c0908d8295..679c5ac2b5 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -59,7 +59,7 @@ LevelMeter::LevelMeter (Session* s) { set_session (s); set_spacing (1); - Config->ParameterChanged.connect (_parameter_connection, boost::bind (&LevelMeter::parameter_changed, this, _1)); + Config->ParameterChanged.connect (_parameter_connection, ui_bind (&LevelMeter::parameter_changed, this, _1), gui_context()); UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &LevelMeter::on_theme_changed)); ColorsChanged.connect (sigc::mem_fun (*this, &LevelMeter::color_handler)); max_peak = minus_infinity(); @@ -85,7 +85,7 @@ LevelMeter::set_meter (PeakMeter* meter) _meter = meter; if (_meter) { - _meter->ConfigurationChanged.connect (_configuration_connection, boost::bind (&LevelMeter::configuration_changed, this, _1, _2)); + _meter->ConfigurationChanged.connect (_configuration_connection, ui_bind (&LevelMeter::configuration_changed, this, _1, _2), gui_context()); } } diff --git a/gtk2_ardour/location_ui.cc b/gtk2_ardour/location_ui.cc index 61a0ec1405..439d64971b 100644 --- a/gtk2_ardour/location_ui.cc +++ b/gtk2_ardour/location_ui.cc @@ -282,11 +282,11 @@ LocationEditRow::set_location (Location *loc) end_clock.set_sensitive (!location->locked()); length_clock.set_sensitive (!location->locked()); - location->start_changed.connect (connections, boost::bind (&LocationEditRow::start_changed, this, _1)); - location->end_changed.connect (connections, boost::bind (&LocationEditRow::end_changed, this, _1)); - location->name_changed.connect (connections, boost::bind (&LocationEditRow::name_changed, this, _1)); - location->changed.connect (connections, boost::bind (&LocationEditRow::location_changed, this, _1)); - location->FlagsChanged.connect (connections, boost::bind (&LocationEditRow::flags_changed, this, _1, _2)); + location->start_changed.connect (connections, ui_bind (&LocationEditRow::start_changed, this, _1), gui_context()); + location->end_changed.connect (connections, ui_bind (&LocationEditRow::end_changed, this, _1), gui_context()); + location->name_changed.connect (connections, ui_bind (&LocationEditRow::name_changed, this, _1), gui_context()); + location->changed.connect (connections, ui_bind (&LocationEditRow::location_changed, this, _1), gui_context()); + location->FlagsChanged.connect (connections, ui_bind (&LocationEditRow::flags_changed, this, _1, _2), gui_context()); } void @@ -860,10 +860,10 @@ LocationUI::set_session(ARDOUR::Session* s) SessionHandlePtr::set_session (s); if (_session) { - _session->locations()->changed.connect (_session_connections, boost::bind (&LocationUI::refresh_location_list, this)); - _session->locations()->StateChanged.connect (_session_connections, boost::bind (&LocationUI::refresh_location_list, this)); - _session->locations()->added.connect (_session_connections, boost::bind (&LocationUI::location_added, this, _1)); - _session->locations()->removed.connect (_session_connections, boost::bind (&LocationUI::location_removed, this, _1)); + _session->locations()->changed.connect (_session_connections, boost::bind (&LocationUI::refresh_location_list, this), gui_context()); + _session->locations()->StateChanged.connect (_session_connections, boost::bind (&LocationUI::refresh_location_list, this), gui_context()); + _session->locations()->added.connect (_session_connections, ui_bind (&LocationUI::location_added, this, _1), gui_context()); + _session->locations()->removed.connect (_session_connections, ui_bind (&LocationUI::location_removed, this, _1), gui_context()); } refresh_location_list (); diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc index 2f108efc8a..d736ba723d 100644 --- a/gtk2_ardour/lv2_plugin_ui.cc +++ b/gtk2_ardour/lv2_plugin_ui.cc @@ -22,6 +22,7 @@ #include "ardour/lv2_plugin.h" #include "ardour_ui.h" +#include "gui_thread.h" #include "lv2_plugin_ui.h" using namespace Gtk; @@ -227,7 +228,7 @@ LV2PluginUI::lv2ui_instantiate(const Glib::ustring& title) } } - _lv2->ParameterChanged.connect (parameter_connection, boost::bind (&LV2PluginUI::parameter_changed, this, _1, _2)); + _lv2->ParameterChanged.connect (parameter_connection, ui_bind (&LV2PluginUI::parameter_changed, this, _1, _2), gui_context()); } LV2PluginUI::~LV2PluginUI () diff --git a/gtk2_ardour/marker_time_axis_view.cc b/gtk2_ardour/marker_time_axis_view.cc index 2d9a30b0a3..6e955146a2 100644 --- a/gtk2_ardour/marker_time_axis_view.cc +++ b/gtk2_ardour/marker_time_axis_view.cc @@ -211,7 +211,7 @@ MarkerTimeAxisView::add_marker_view(ImageFrameView* ifv, std::string mark_type, ifv->add_marker_view_item(mv, src) ; marker_view_list.push_front(mv) ; - mv->GoingAway.connect (*this, boost::bind (&MarkerTimeAxisView::remove_marker_view, this, (void*)this)); + mv->GoingAway.connect (*this, boost::bind (&MarkerTimeAxisView::remove_marker_view, this, (void*)this), gui_context()); MarkerViewAdded(mv,src) ; /* EMIT_SIGNAL */ diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 4f0c25a72c..8d186eac9b 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -585,7 +585,7 @@ MidiRegionView::display_model(boost::shared_ptr<MidiModel> model) { _model = model; content_connection.disconnect (); - _model->ContentsChanged.connect (content_connection, boost::bind (&MidiRegionView::redisplay_model, this)); + _model->ContentsChanged.connect (content_connection, boost::bind (&MidiRegionView::redisplay_model, this), gui_context()); clear_events (); @@ -1071,7 +1071,7 @@ MidiRegionView::add_ghost (TimeAxisView& tv) } } - ghost->GoingAway.connect (*this, boost::bind (&RegionView::remove_ghost, this, _1)); + ghost->GoingAway.connect (*this, ui_bind (&RegionView::remove_ghost, this, _1), gui_context()); return ghost; } diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index e8c25e8647..66f0393f3d 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -25,7 +25,7 @@ #include <libgnomecanvasmm.h> #include <libgnomecanvasmm/polygon.h> -#include <boost/signals2.hpp> +#include "pbd/signals.h" #include "ardour/midi_track.h" #include "ardour/midi_region.h" @@ -389,7 +389,7 @@ class MidiRegionView : public RegionView std::vector<NoteResizeData *> _resize_data; /* connection used to connect to model's ContentChanged signal */ - boost::signals2::scoped_connection content_connection; + PBD::ScopedConnection content_connection; ArdourCanvas::CanvasNoteEvent* find_canvas_note (boost::shared_ptr<NoteType>); Events::iterator _optimization_iterator; diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 76d34a4a50..0d50c8910f 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -180,7 +180,7 @@ MidiStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wfd, display_region (region_view, wfd); /* catch regionview going away */ - region->GoingAway.connect (*this, boost::bind (&MidiStreamView::remove_region_view, this, region)); + region->GoingAway.connect (*this, boost::bind (&MidiStreamView::remove_region_view, this, region), gui_context()); RegionViewAdded (region_view); @@ -402,8 +402,9 @@ MidiStreamView::setup_rec_box () sources.push_back(mds->write_source()); mds->write_source()->ViewDataRangeReady.connect - (rec_data_ready_connections, boost::bind (&MidiStreamView::rec_data_range_ready, this, - _1, _2, boost::weak_ptr<Source>(mds->write_source()))); + (rec_data_ready_connections, + ui_bind (&MidiStreamView::rec_data_range_ready, this, _1, _2, boost::weak_ptr<Source>(mds->write_source())), + gui_context()); // handle multi diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index 3b1ad17a22..3b759867c8 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -137,7 +137,7 @@ MidiTimeAxisView::MidiTimeAxisView (PublicEditor& ed, Session* sess, set_state (*xml_node, Stateful::loading_state_version); - _route->processors_changed.connect (*this, boost::bind (&MidiTimeAxisView::processors_changed, this, _1)); + _route->processors_changed.connect (*this, ui_bind (&MidiTimeAxisView::processors_changed, this, _1), gui_context()); if (is_track()) { _piano_roll_header = new PianoRollHeader(*midi_view()); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 275cd14b02..9578e8dd0c 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -257,8 +257,8 @@ MixerStrip::init () _packed = false; _embedded = false; - _session->engine().Stopped.connect (*this, boost::bind (&MixerStrip::engine_stopped, this)); - _session->engine().Running.connect (*this, boost::bind (&MixerStrip::engine_running, this)); + _session->engine().Stopped.connect (*this, boost::bind (&MixerStrip::engine_stopped, this), gui_context()); + _session->engine().Running.connect (*this, boost::bind (&MixerStrip::engine_running, this), gui_context()); input_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::input_press), false); output_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::output_press), false); @@ -363,7 +363,7 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt) boost::shared_ptr<AudioTrack> at = audio_track(); - at->FreezeChange.connect (route_connections, boost::bind (&MixerStrip::map_frozen, this)); + at->FreezeChange.connect (route_connections, boost::bind (&MixerStrip::map_frozen, this), gui_context()); button_table.attach (*rec_enable_button, 0, 2, 2, 3); rec_enable_button->set_sensitive (_session->writable()); @@ -412,22 +412,22 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt) _("Click to Add/Edit Comments"): _route->comment()); - _route->meter_change.connect (route_connections, boost::bind (&MixerStrip::meter_changed, this, _1)); - _route->input()->changed.connect (route_connections, boost::bind (&MixerStrip::input_changed, this, _1, _2)); - _route->output()->changed.connect (route_connections, boost::bind (&MixerStrip::output_changed, this, _1, _2)); - _route->route_group_changed.connect (route_connections, boost::bind (&MixerStrip::route_group_changed, this)); + _route->meter_change.connect (route_connections, ui_bind (&MixerStrip::meter_changed, this, _1), gui_context()); + _route->input()->changed.connect (route_connections, ui_bind (&MixerStrip::input_changed, this, _1, _2), gui_context()); + _route->output()->changed.connect (route_connections, ui_bind (&MixerStrip::output_changed, this, _1, _2), gui_context()); + _route->route_group_changed.connect (route_connections, boost::bind (&MixerStrip::route_group_changed, this), gui_context()); if (_route->panner()) { - _route->panner()->Changed.connect (route_connections, boost::bind (&MixerStrip::connect_to_pan, this)); + _route->panner()->Changed.connect (route_connections, boost::bind (&MixerStrip::connect_to_pan, this), gui_context()); } if (is_audio_track()) { - audio_track()->DiskstreamChanged.connect (route_connections, boost::bind (&MixerStrip::diskstream_changed, this)); + audio_track()->DiskstreamChanged.connect (route_connections, boost::bind (&MixerStrip::diskstream_changed, this), gui_context()); } - _route->NameChanged.connect (route_connections, boost::bind (&RouteUI::name_changed, this)); - _route->comment_changed.connect (route_connections, boost::bind (&MixerStrip::comment_changed, this, _1)); - _route->gui_changed.connect (route_connections, boost::bind (&MixerStrip::route_gui_changed, this, _1, _2)); + _route->NameChanged.connect (route_connections, boost::bind (&RouteUI::name_changed, this), gui_context()); + _route->comment_changed.connect (route_connections, ui_bind (&MixerStrip::comment_changed, this, _1), gui_context()); + _route->gui_changed.connect (route_connections, ui_bind (&MixerStrip::route_gui_changed, this, _1, _2), gui_context()); set_stuff_from_route (); @@ -928,8 +928,8 @@ MixerStrip::connect_to_pan () _route->panner()->data().control(Evoral::Parameter(PanAutomation))); if (pan_control) { - pan_control->alist()->automation_state_changed.connect (panstate_connection, boost::bind (&PannerUI::pan_automation_state_changed, &panners)); - pan_control->alist()->automation_style_changed.connect (panstyle_connection, boost::bind (&PannerUI::pan_automation_style_changed, &panners)); + pan_control->alist()->automation_state_changed.connect (panstate_connection, boost::bind (&PannerUI::pan_automation_state_changed, &panners), gui_context()); + pan_control->alist()->automation_style_changed.connect (panstyle_connection, boost::bind (&PannerUI::pan_automation_style_changed, &panners), gui_context()); } panners.pan_changed (this); @@ -1693,7 +1693,7 @@ MixerStrip::show_send (boost::shared_ptr<Send> send) _current_delivery = send; send->set_metering (true); - _current_delivery->GoingAway.connect (send_gone_connection, boost::bind (&MixerStrip::revert_to_default_display, this)); + _current_delivery->GoingAway.connect (send_gone_connection, boost::bind (&MixerStrip::revert_to_default_display, this), gui_context()); gain_meter().set_controls (_route, send->meter(), send->amp()); gain_meter().setup_meters (); diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h index 64579e0c33..0e432eed3e 100644 --- a/gtk2_ardour/mixer_strip.h +++ b/gtk2_ardour/mixer_strip.h @@ -214,8 +214,8 @@ class MixerStrip : public RouteUI, public Gtk::EventBox void input_changed (ARDOUR::IOChange, void *); void output_changed (ARDOUR::IOChange, void *); - boost::signals2::scoped_connection panstate_connection; - boost::signals2::scoped_connection panstyle_connection; + PBD::ScopedConnection panstate_connection; + PBD::ScopedConnection panstyle_connection; void connect_to_pan (); void update_diskstream_display (); @@ -265,7 +265,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox void revert_to_default_display (); void drop_send (); - boost::signals2::scoped_connection send_gone_connection; + PBD::ScopedConnection send_gone_connection; void reset_strip_style (); diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 0484db6fe7..799352c87d 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -74,7 +74,7 @@ Mixer_UI::Mixer_UI () strip_redisplay_does_not_sync_order_keys = false; ignore_sync = false; - Route::SyncOrderKeys.connect (*this, boost::bind (&Mixer_UI::sync_order_keys, this, _1)); + Route::SyncOrderKeys.connect (*this, ui_bind (&Mixer_UI::sync_order_keys, this, _1), gui_context()); scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); scroller_base.set_name ("MixerWindow"); @@ -333,9 +333,9 @@ Mixer_UI::add_strip (RouteList& routes) route->set_order_key (N_("signal"), track_model->children().size()-1); } - route->NameChanged.connect (*this, boost::bind (&Mixer_UI::strip_name_changed, this, strip)); + route->NameChanged.connect (*this, boost::bind (&Mixer_UI::strip_name_changed, this, strip), gui_context()); - strip->GoingAway.connect (*this, boost::bind (&Mixer_UI::remove_strip, this, strip)); + strip->GoingAway.connect (*this, boost::bind (&Mixer_UI::remove_strip, this, strip), gui_context()); strip->WidthChanged.connect (sigc::mem_fun(*this, &Mixer_UI::strip_width_changed)); strip->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::strip_button_release_event), strip)); } @@ -476,10 +476,10 @@ Mixer_UI::set_session (Session* sess) initial_track_display (); - _session->RouteAdded.connect (_session_connections, boost::bind (&Mixer_UI::add_strip, this, _1)); - _session->route_group_added.connect (_session_connections, boost::bind (&Mixer_UI::add_route_group, this, _1)); - _session->route_group_removed.connect (_session_connections, boost::bind (&Mixer_UI::route_groups_changed, this)); - _session->config.ParameterChanged.connect (_session_connections, boost::bind (&Mixer_UI::parameter_changed, this, _1)); + _session->RouteAdded.connect (_session_connections, ui_bind (&Mixer_UI::add_strip, this, _1), gui_context()); + _session->route_group_added.connect (_session_connections, ui_bind (&Mixer_UI::add_route_group, this, _1), gui_context()); + _session->route_group_removed.connect (_session_connections, boost::bind (&Mixer_UI::route_groups_changed, this), gui_context()); + _session->config.ParameterChanged.connect (_session_connections, ui_bind (&Mixer_UI::parameter_changed, this, _1), gui_context()); route_groups_changed (); @@ -1252,7 +1252,7 @@ Mixer_UI::add_route_group (RouteGroup* group) focus = true; } - group->FlagsChanged.connect (*this, boost::bind (&Mixer_UI::group_flags_changed, this, _1, group)); + group->FlagsChanged.connect (*this, ui_bind (&Mixer_UI::group_flags_changed, this, _1, group), gui_context()); if (focus) { TreeViewColumn* col = group_display.get_column (0); diff --git a/gtk2_ardour/option_editor.cc b/gtk2_ardour/option_editor.cc index f11731b6de..b779d24421 100644 --- a/gtk2_ardour/option_editor.cc +++ b/gtk2_ardour/option_editor.cc @@ -164,7 +164,7 @@ OptionEditor::OptionEditor (Configuration* c, std::string const & t) show_all_children(); /* Watch out for changes to parameters */ - _config->ParameterChanged.connect (config_connection, boost::bind (&OptionEditor::parameter_changed, this, _1)); + _config->ParameterChanged.connect (config_connection, ui_bind (&OptionEditor::parameter_changed, this, _1), gui_context()); } OptionEditor::~OptionEditor () diff --git a/gtk2_ardour/panner2d.cc b/gtk2_ardour/panner2d.cc index 8b7f5802b5..3e70472ffe 100644 --- a/gtk2_ardour/panner2d.cc +++ b/gtk2_ardour/panner2d.cc @@ -72,8 +72,8 @@ Panner2d::Panner2d (boost::shared_ptr<Panner> p, int32_t h) allow_y = false; allow_target = false; - panner->StateChanged.connect (state_connection, boost::bind (&Panner2d::handle_state_change, this)); - panner->Changed.connect (change_connection, boost::bind (&Panner2d::handle_position_change, this)); + panner->StateChanged.connect (state_connection, boost::bind (&Panner2d::handle_state_change, this), gui_context()); + panner->Changed.connect (change_connection, boost::bind (&Panner2d::handle_position_change, this), gui_context()); drag_target = 0; set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK); diff --git a/gtk2_ardour/panner_ui.cc b/gtk2_ardour/panner_ui.cc index 4321a7ebad..0d2297383c 100644 --- a/gtk2_ardour/panner_ui.cc +++ b/gtk2_ardour/panner_ui.cc @@ -151,9 +151,9 @@ PannerUI::set_panner (boost::shared_ptr<Panner> p) return; } - _panner->Changed.connect (connections, boost::bind (&PannerUI::panner_changed, this)); - _panner->LinkStateChanged.connect (connections, boost::bind (&PannerUI::update_pan_linkage, this)); - _panner->StateChanged.connect (connections, boost::bind (&PannerUI::update_pan_state, this)); + _panner->Changed.connect (connections, boost::bind (&PannerUI::panner_changed, this), gui_context()); + _panner->LinkStateChanged.connect (connections, boost::bind (&PannerUI::update_pan_linkage, this), gui_context()); + _panner->StateChanged.connect (connections, boost::bind (&PannerUI::update_pan_state, this), gui_context()); setup_pan (); @@ -404,7 +404,7 @@ PannerUI::setup_pan () pan_adjustments.back()->set_value(rx); pan_adjustments.back()->signal_value_changed().connect (sigc::bind (sigc::mem_fun(*this, &PannerUI::pan_adjustment_changed), (uint32_t) asz)); - _panner->pan_control( asz )->Changed.connect (connections, boost::bind (&PannerUI::pan_value_changed, this, (uint32_t) asz)); + _panner->pan_control( asz )->Changed.connect (connections, boost::bind (&PannerUI::pan_value_changed, this, (uint32_t) asz), gui_context()); bc->set_name ("PanSlider"); bc->set_shadow_type (Gtk::SHADOW_NONE); diff --git a/gtk2_ardour/plugin_eq_gui.cc b/gtk2_ardour/plugin_eq_gui.cc index 3ee64fc9b5..9ec485b62b 100644 --- a/gtk2_ardour/plugin_eq_gui.cc +++ b/gtk2_ardour/plugin_eq_gui.cc @@ -115,7 +115,7 @@ PluginEqGui::PluginEqGui(boost::shared_ptr<ARDOUR::PluginInsert> pluginInsert) // Connect the realtime signal collection callback - _plugin_insert->AnalysisDataGathered.connect (analysis_connection, boost::bind (&PluginEqGui::signal_collect_callback, this, _1, _2)); + _plugin_insert->AnalysisDataGathered.connect (analysis_connection, ui_bind (&PluginEqGui::signal_collect_callback, this, _1, _2), gui_context()); } PluginEqGui::~PluginEqGui() diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc index 48bb5f5c7e..63ec9abf37 100644 --- a/gtk2_ardour/plugin_selector.cc +++ b/gtk2_ardour/plugin_selector.cc @@ -74,7 +74,7 @@ PluginSelector::PluginSelector (PluginManager *mgr) manager = mgr; in_row_change = false; - manager->PluginListChanged.connect (plugin_list_changed_connection, boost::bind (&PluginSelector::build_plugin_menu, this)); + manager->PluginListChanged.connect (plugin_list_changed_connection, boost::bind (&PluginSelector::build_plugin_menu, this), gui_context()); build_plugin_menu (); plugin_model = Gtk::ListStore::create (plugin_columns); diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index 24106c4351..209904dea1 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -142,7 +142,7 @@ PluginUIWindow::PluginUIWindow (Gtk::Window* win, boost::shared_ptr<PluginInsert add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); signal_delete_event().connect (sigc::bind (sigc::ptr_fun (just_hide_it), reinterpret_cast<Window*> (this)), false); - insert->GoingAway.connect (death_connection, boost::bind (&PluginUIWindow::plugin_going_away, this)); + insert->GoingAway.connect (death_connection, boost::bind (&PluginUIWindow::plugin_going_away, this), gui_context()); gint h = _pluginui->get_preferred_height (); gint w = _pluginui->get_preferred_width (); @@ -390,7 +390,7 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi) save_button.set_name ("PluginSaveButton"); save_button.signal_clicked().connect(sigc::mem_fun(*this, &PlugUIBase::save_plugin_setting)); - insert->ActiveChanged.connect (active_connection, boost::bind (&PlugUIBase::processor_active_changed, this, boost::weak_ptr<Processor>(insert))); + insert->ActiveChanged.connect (active_connection, boost::bind (&PlugUIBase::processor_active_changed, this, boost::weak_ptr<Processor>(insert)), gui_context()); bypass_button.set_active (!pi->active()); @@ -414,7 +414,7 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi) plugin_analysis_expander.property_expanded().signal_changed().connect( sigc::mem_fun(*this, &PlugUIBase::toggle_plugin_analysis)); plugin_analysis_expander.set_expanded(false); - insert->GoingAway.connect (death_connection, boost::bind (&PlugUIBase::plugin_going_away, this)); + insert->GoingAway.connect (death_connection, boost::bind (&PlugUIBase::plugin_going_away, this), gui_context()); } PlugUIBase::~PlugUIBase() diff --git a/gtk2_ardour/plugin_ui.h b/gtk2_ardour/plugin_ui.h index b2e0504538..d1ea82f830 100644 --- a/gtk2_ardour/plugin_ui.h +++ b/gtk2_ardour/plugin_ui.h @@ -264,7 +264,7 @@ class PluginUIWindow : public Gtk::Window private: Glib::ustring _title; PlugUIBase* _pluginui; - boost::signals2::scoped_connection death_connection; + PBD::ScopedConnection death_connection; Gtk::Window* parent; Gtk::VBox vbox; bool non_gtk_gui; diff --git a/gtk2_ardour/port_group.cc b/gtk2_ardour/port_group.cc index 4c983d1a62..3b10ff1abf 100644 --- a/gtk2_ardour/port_group.cc +++ b/gtk2_ardour/port_group.cc @@ -30,6 +30,7 @@ #include "ardour/session.h" #include "ardour/auditioner.h" +#include "gui_thread.h" #include "port_group.h" #include "port_matrix.h" #include "time_axis_view.h" @@ -116,7 +117,7 @@ PortGroup::add_bundle_internal (boost::shared_ptr<Bundle> b, boost::shared_ptr<I } BundleRecord* br = new BundleRecord (b, io, colour, has_colour); - b->Changed.connect (br->changed_connection, boost::bind (&PortGroup::bundle_changed, this, _1)); + b->Changed.connect (br->changed_connection, ui_bind (&PortGroup::bundle_changed, this, _1), gui_context()); _bundles.push_back (br); Changed (); @@ -521,8 +522,8 @@ PortGroupList::add_group (boost::shared_ptr<PortGroup> g) { _groups.push_back (g); - g->Changed.connect (_changed_connections, boost::bind (&PortGroupList::emit_changed, this)); - g->BundleChanged.connect (_bundle_changed_connections, boost::bind (&PortGroupList::emit_bundle_changed, this, _1)); + g->Changed.connect (_changed_connections, boost::bind (&PortGroupList::emit_changed, this), gui_context()); + g->BundleChanged.connect (_bundle_changed_connections, ui_bind (&PortGroupList::emit_bundle_changed, this, _1), gui_context()); emit_changed (); } diff --git a/gtk2_ardour/port_group.h b/gtk2_ardour/port_group.h index bc0615a7a9..d5868bddd6 100644 --- a/gtk2_ardour/port_group.h +++ b/gtk2_ardour/port_group.h @@ -78,7 +78,7 @@ public: boost::shared_ptr<ARDOUR::IO> io; Gdk::Color colour; bool has_colour; - boost::signals2::scoped_connection changed_connection; + PBD::ScopedConnection changed_connection; BundleRecord (boost::shared_ptr<ARDOUR::Bundle>, boost::shared_ptr<ARDOUR::IO>, Gdk::Color, bool has_colour); }; diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc index 7e2a1d892a..33115432e6 100644 --- a/gtk2_ardour/port_matrix.cc +++ b/gtk2_ardour/port_matrix.cc @@ -135,10 +135,10 @@ PortMatrix::init () for (int i = 0; i < 2; ++i) { /* watch for the content of _ports[] changing */ - _ports[i].Changed.connect (_changed_connections, boost::bind (&PortMatrix::setup, this)); + _ports[i].Changed.connect (_changed_connections, boost::bind (&PortMatrix::setup, this), gui_context()); /* and for bundles in _ports[] changing */ - _ports[i].BundleChanged.connect (_bundle_changed_connections, boost::bind (&PortMatrix::setup, this)); + _ports[i].BundleChanged.connect (_bundle_changed_connections, boost::bind (&PortMatrix::setup, this), gui_context()); } /* scrolling stuff */ @@ -149,13 +149,13 @@ PortMatrix::init () /* Part 2: notice when things have changed that require our subclass to clear and refill _ports[] */ /* watch for routes being added or removed */ - _session->RouteAdded.connect (_session_connections, boost::bind (&PortMatrix::routes_changed, this)); + _session->RouteAdded.connect (_session_connections, boost::bind (&PortMatrix::routes_changed, this), gui_context()); /* and also bundles */ - _session->BundleAdded.connect (_session_connections, boost::bind (&PortMatrix::setup_global_ports, this)); + _session->BundleAdded.connect (_session_connections, boost::bind (&PortMatrix::setup_global_ports, this), gui_context()); /* and also ports */ - _session->engine().PortRegisteredOrUnregistered.connect (_session_connections, boost::bind (&PortMatrix::setup_global_ports, this)); + _session->engine().PortRegisteredOrUnregistered.connect (_session_connections, boost::bind (&PortMatrix::setup_global_ports, this), gui_context()); reconnect_to_routes (); @@ -170,7 +170,7 @@ PortMatrix::reconnect_to_routes () boost::shared_ptr<RouteList> routes = _session->get_routes (); for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { - (*i)->processors_changed.connect (_route_connections, boost::bind (&PortMatrix::route_processors_changed, this, _1)); + (*i)->processors_changed.connect (_route_connections, ui_bind (&PortMatrix::route_processors_changed, this, _1), gui_context()); } } diff --git a/gtk2_ardour/port_matrix_body.cc b/gtk2_ardour/port_matrix_body.cc index 0732873f5c..e14a16d180 100644 --- a/gtk2_ardour/port_matrix_body.cc +++ b/gtk2_ardour/port_matrix_body.cc @@ -20,6 +20,8 @@ #include <iostream> #include "ardour/bundle.h" #include "ardour/types.h" + +#include "gui_thread.h" #include "port_matrix_body.h" #include "port_matrix.h" #include "port_matrix_column_labels.h" @@ -254,7 +256,7 @@ PortMatrixBody::setup () PortGroup::BundleList r = _matrix->visible_rows()->bundles (); for (PortGroup::BundleList::iterator i = r.begin(); i != r.end(); ++i) { - (*i)->bundle->Changed.connect (_bundle_connections, boost::bind (&PortMatrixBody::rebuild_and_draw_row_labels, this)); + (*i)->bundle->Changed.connect (_bundle_connections, boost::bind (&PortMatrixBody::rebuild_and_draw_row_labels, this), gui_context()); } } @@ -262,7 +264,7 @@ PortMatrixBody::setup () if (_matrix->visible_columns()) { PortGroup::BundleList c = _matrix->visible_columns()->bundles (); for (PortGroup::BundleList::iterator i = c.begin(); i != c.end(); ++i) { - (*i)->bundle->Changed.connect (_bundle_connections, boost::bind (&PortMatrixBody::rebuild_and_draw_column_labels, this)); + (*i)->bundle->Changed.connect (_bundle_connections, boost::bind (&PortMatrixBody::rebuild_and_draw_column_labels, this), gui_context()); } } diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 615294b6ac..400063c2b6 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -106,8 +106,8 @@ ProcessorEntry::ProcessorEntry (boost::shared_ptr<Processor> p, Width w) _active.set_active (_processor->active ()); _active.signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::active_toggled)); - _processor->ActiveChanged.connect (active_connection, boost::bind (&ProcessorEntry::processor_active_changed, this)); - _processor->NameChanged.connect (name_connection, boost::bind (&ProcessorEntry::processor_name_changed, this)); + _processor->ActiveChanged.connect (active_connection, boost::bind (&ProcessorEntry::processor_active_changed, this), gui_context()); + _processor->NameChanged.connect (name_connection, boost::bind (&ProcessorEntry::processor_name_changed, this), gui_context()); } EventBox& @@ -229,7 +229,7 @@ SendProcessorEntry::SendProcessorEntry (boost::shared_ptr<Send> s, Width w) _vbox.pack_start (_fader); _adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &SendProcessorEntry::gain_adjusted)); - _send->amp()->gain_control()->Changed.connect (send_gain_connection, boost::bind (&SendProcessorEntry::show_gain, this)); + _send->amp()->gain_control()->Changed.connect (send_gain_connection, boost::bind (&SendProcessorEntry::show_gain, this), gui_context()); show_gain (); } @@ -326,9 +326,9 @@ ProcessorBox::set_route (boost::shared_ptr<Route> r) no_processor_redisplay = false; _route = r; - _route->processors_changed.connect (connections, boost::bind (&ProcessorBox::route_processors_changed, this, _1)); - _route->GoingAway.connect (connections, boost::bind (&ProcessorBox::route_going_away, this)); - _route->NameChanged.connect (connections, boost::bind (&ProcessorBox::route_name_changed, this)); + _route->processors_changed.connect (connections, ui_bind (&ProcessorBox::route_processors_changed, this, _1), gui_context()); + _route->GoingAway.connect (connections, boost::bind (&ProcessorBox::route_going_away, this), gui_context()); + _route->NameChanged.connect (connections, boost::bind (&ProcessorBox::route_name_changed, this), gui_context()); redisplay_processors (); } diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index c4c75ea6d7..4a5bce4674 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -10,6 +10,8 @@ #include "ardour/rc_configuration.h" #include "ardour/control_protocol_manager.h" #include "control_protocol/control_protocol.h" + +#include "gui_thread.h" #include "rc_option_editor.h" #include "utils.h" #include "midi_port_dialog.h" @@ -117,7 +119,7 @@ private: if ((*i)->input()) { r[_model.online] = !(*i)->input()->offline(); - (*i)->input()->OfflineStatusChanged.connect (port_connections, boost::bind (&MIDIPorts::port_offline_changed, this, (*i))); + (*i)->input()->OfflineStatusChanged.connect (port_connections, boost::bind (&MIDIPorts::port_offline_changed, this, (*i)), gui_context()); r[_model.trace_input] = (*i)->input()->tracing(); } diff --git a/gtk2_ardour/region_selection.cc b/gtk2_ardour/region_selection.cc index bbb5d33865..637d902ff7 100644 --- a/gtk2_ardour/region_selection.cc +++ b/gtk2_ardour/region_selection.cc @@ -20,6 +20,7 @@ #include "ardour/region.h" +#include "gui_thread.h" #include "region_view.h" #include "region_selection.h" #include "time_axis_view.h" @@ -32,7 +33,7 @@ using namespace PBD; */ RegionSelection::RegionSelection () { - RegionView::RegionViewGoingAway.connect (death_connection, boost::bind (&RegionSelection::remove_it, this, _1)); + RegionView::RegionViewGoingAway.connect (death_connection, ui_bind (&RegionSelection::remove_it, this, _1), gui_context()); _current_start = 0; _current_end = 0; @@ -44,7 +45,7 @@ RegionSelection::RegionSelection () RegionSelection::RegionSelection (const RegionSelection& other) : std::list<RegionView*>() { - RegionView::RegionViewGoingAway.connect (death_connection, boost::bind (&RegionSelection::remove_it, this, _1)); + RegionView::RegionViewGoingAway.connect (death_connection, ui_bind (&RegionSelection::remove_it, this, _1), gui_context()); _current_start = other._current_start; _current_end = other._current_end; diff --git a/gtk2_ardour/region_selection.h b/gtk2_ardour/region_selection.h index dcb6d68e0c..c4ad44da37 100644 --- a/gtk2_ardour/region_selection.h +++ b/gtk2_ardour/region_selection.h @@ -22,8 +22,7 @@ #include <set> #include <list> -#include <boost/signals2.hpp> - +#include "pbd/signals.h" #include "ardour/types.h" class RegionView; @@ -71,7 +70,7 @@ class RegionSelection : public std::list<RegionView*> nframes_t _current_end; ///< end position for the selection std::list<RegionView *> _bylayer; ///< list of regions sorted by layer - boost::signals2::scoped_connection death_connection; + PBD::ScopedConnection death_connection; }; #endif /* __ardour_gtk_region_selection_h__ */ diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc index cdfeceaa8d..770057687a 100644 --- a/gtk2_ardour/region_view.cc +++ b/gtk2_ardour/region_view.cc @@ -178,7 +178,7 @@ RegionView::init (Gdk::Color const & basic_color, bool wfd) set_height (trackview.current_height()); - _region->StateChanged.connect (*this, boost::bind (&RegionView::region_changed, this, _1)); + _region->StateChanged.connect (*this, ui_bind (&RegionView::region_changed, this, _1), gui_context()); group->signal_event().connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_region_view_event), group, this)); diff --git a/gtk2_ardour/return_ui.cc b/gtk2_ardour/return_ui.cc index fe1593a4aa..67e05dc47a 100644 --- a/gtk2_ardour/return_ui.cc +++ b/gtk2_ardour/return_ui.cc @@ -57,7 +57,7 @@ ReturnUI::ReturnUI (Gtk::Window* parent, boost::shared_ptr<Return> r, Session* s show_all (); _return->set_metering (true); - _return->input()->changed.connect (input_change_connection, boost::bind (&ReturnUI::ins_changed, this, _1, _2)); + _return->input()->changed.connect (input_change_connection, ui_bind (&ReturnUI::ins_changed, this, _1, _2), gui_context()); _gpm.setup_meters (); _gpm.set_fader_name ("ReturnUIFrame"); @@ -110,7 +110,7 @@ ReturnUIWindow::ReturnUIWindow (boost::shared_ptr<Return> r, ARDOUR::Session* s) set_name ("ReturnUIWindow"); - r->GoingAway.connect (going_away_connection, boost::bind (&ReturnUIWindow::return_going_away, this)); + r->GoingAway.connect (going_away_connection, boost::bind (&ReturnUIWindow::return_going_away, this), gui_context()); signal_delete_event().connect (sigc::bind (sigc::ptr_fun (just_hide_it), reinterpret_cast<Window *> (this))); } diff --git a/gtk2_ardour/return_ui.h b/gtk2_ardour/return_ui.h index 0f6735c9ea..8c9e87074c 100644 --- a/gtk2_ardour/return_ui.h +++ b/gtk2_ardour/return_ui.h @@ -69,7 +69,7 @@ class ReturnUIWindow : public ArdourDialog Gtk::HBox hpacker; void return_going_away (); - boost::signals2::scoped_connection going_away_connection; + PBD::ScopedConnection going_away_connection; }; #endif /* __ardour_gtk_return_ui_h__ */ diff --git a/gtk2_ardour/route_params_ui.cc b/gtk2_ardour/route_params_ui.cc index cf37c2dad4..bfa209d81e 100644 --- a/gtk2_ardour/route_params_ui.cc +++ b/gtk2_ardour/route_params_ui.cc @@ -181,8 +181,8 @@ RouteParams_UI::add_routes (RouteList& routes) //route_select_list.rows().back().select (); - route->NameChanged.connect (*this, boost::bind (&RouteParams_UI::route_name_changed, this, boost::weak_ptr<Route>(route))); - route->GoingAway.connect (*this, boost::bind (&RouteParams_UI::route_removed, this, boost::weak_ptr<Route>(route))); + route->NameChanged.connect (*this, boost::bind (&RouteParams_UI::route_name_changed, this, boost::weak_ptr<Route>(route)), gui_context()); + route->GoingAway.connect (*this, boost::bind (&RouteParams_UI::route_removed, this, boost::weak_ptr<Route>(route)), gui_context()); } } @@ -293,8 +293,8 @@ RouteParams_UI::setup_latency_frame () latency_packer.pack_start (delay_label); latency_click_connection = latency_apply_button.signal_clicked().connect (sigc::mem_fun (*latency_widget, &LatencyGUI::finish)); - _route->signal_latency_changed.connect (latency_connections, sigc::mem_fun (*this, &RouteParams_UI::refresh_latency)); - _route->initial_delay_changed.connect (latency_connections, sigc::mem_fun (*this, &RouteParams_UI::refresh_latency)); + _route->signal_latency_changed.connect (latency_connections, boost::bind (&RouteParams_UI::refresh_latency, this), gui_context()); + _route->initial_delay_changed.connect (latency_connections, boost::bind (&RouteParams_UI::refresh_latency, this), gui_context()); latency_frame.add (latency_packer); latency_frame.show_all (); @@ -399,7 +399,7 @@ RouteParams_UI::set_session (Session *sess) if (_session) { boost::shared_ptr<RouteList> r = _session->get_routes(); add_routes (*r); - _session->RouteAdded.connect (_session_connections, sigc::mem_fun(*this, &RouteParams_UI::add_routes)); + _session->RouteAdded.connect (_session_connections, ui_bind (&RouteParams_UI::add_routes, this, _1), gui_context()); start_updating (); } else { stop_updating (); @@ -458,7 +458,7 @@ RouteParams_UI::route_selected() setup_processor_boxes(); setup_latency_frame (); - route->processors_changed.connect (_route_processors_connection, boost::bind (&RouteParams_UI::processors_changed, this, _1)); + route->processors_changed.connect (_route_processors_connection, ui_bind (&RouteParams_UI::processors_changed, this, _1), gui_context()); track_input_label.set_text (_route->name()); @@ -522,7 +522,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc) SendUI *send_ui = new SendUI (this, send, _session); cleanup_view(); - send->GoingAway.connect (_processor_going_away_connection, boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor>(proc))); + send->GoingAway.connect (_processor_going_away_connection, boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor>(proc)), gui_context()); _active_view = send_ui; redir_hpane.add2 (*_active_view); @@ -533,7 +533,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc) ReturnUI *return_ui = new ReturnUI (this, retrn, _session); cleanup_view(); - retrn->GoingAway.connect (_processor_going_away_connection, boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor>(proc))); + retrn->GoingAway.connect (_processor_going_away_connection, boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor>(proc)), gui_context()); _active_view = return_ui; redir_hpane.add2 (*_active_view); @@ -544,7 +544,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc) GenericPluginUI *plugin_ui = new GenericPluginUI (plugin_insert, true); cleanup_view(); - plugin_insert->plugin()->GoingAway.connect (_processor_going_away_connection, boost::bind (&RouteParams_UI::plugin_going_away, this, PreFader)); + plugin_insert->plugin()->GoingAway.connect (_processor_going_away_connection, boost::bind (&RouteParams_UI::plugin_going_away, this, PreFader), gui_context()); plugin_ui->start_updating (0); _active_view = plugin_ui; @@ -556,7 +556,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc) PortInsertUI *portinsert_ui = new PortInsertUI (this, _session, port_insert); cleanup_view(); - port_insert->GoingAway.connect (_processor_going_away_connection, boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor> (proc))); + port_insert->GoingAway.connect (_processor_going_away_connection, boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor> (proc)), gui_context()); _active_view = portinsert_ui; redir_hpane.pack2 (*_active_view); diff --git a/gtk2_ardour/route_params_ui.h b/gtk2_ardour/route_params_ui.h index a1a9323134..c09d3c65cd 100644 --- a/gtk2_ardour/route_params_ui.h +++ b/gtk2_ardour/route_params_ui.h @@ -126,10 +126,10 @@ class RouteParams_UI : public ArdourDialog, public PBD::ScopedConnectionList RouteRedirectSelection _rr_selection; boost::shared_ptr<ARDOUR::Route> _route; - boost::signals2::scoped_connection _route_processors_connection; + PBD::ScopedConnection _route_processors_connection; boost::shared_ptr<ARDOUR::Processor> _processor; - boost::signals2::scoped_connection _processor_going_away_connection; + PBD::ScopedConnection _processor_going_away_connection; enum ConfigView { diff --git a/gtk2_ardour/route_processor_selection.cc b/gtk2_ardour/route_processor_selection.cc index 2f4a31a3e0..4e934b0a3c 100644 --- a/gtk2_ardour/route_processor_selection.cc +++ b/gtk2_ardour/route_processor_selection.cc @@ -94,7 +94,7 @@ RouteRedirectSelection::add (boost::shared_ptr<Route> r) { if (find (routes.begin(), routes.end(), r) == routes.end()) { routes.push_back (r); - r->GoingAway.connect (*this, boost::bind (&RouteRedirectSelection::removed, this, boost::weak_ptr<Route>(r))); + r->GoingAway.connect (*this, boost::bind (&RouteRedirectSelection::removed, this, boost::weak_ptr<Route>(r)), gui_context()); RoutesChanged(); } } diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 442fb959c4..0e5088cd26 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -193,9 +193,9 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh } controls_hbox.pack_start(gm.get_level_meter(), false, false); - _route->meter_change.connect (*this, boost::bind (&RouteTimeAxisView::meter_changed, this, _1)); - _route->input()->changed.connect (*this, boost::bind (&RouteTimeAxisView::io_changed, this, _1, _2)); - _route->output()->changed.connect (*this, boost::bind (&RouteTimeAxisView::io_changed, this, _1, _2)); + _route->meter_change.connect (*this, ui_bind (&RouteTimeAxisView::meter_changed, this, _1), gui_context()); + _route->input()->changed.connect (*this, ui_bind (&RouteTimeAxisView::io_changed, this, _1, _2), gui_context()); + _route->output()->changed.connect (*this, ui_bind (&RouteTimeAxisView::io_changed, this, _1, _2), gui_context()); controls_table.attach (*mute_button, 6, 7, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0); controls_table.attach (*solo_button, 7, 8, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0); @@ -234,19 +234,19 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh _y_position = -1; - _route->mute_changed.connect (*this, boost::bind (&RouteUI::mute_changed, this, _1)); - _route->solo_changed.connect (*this, boost::bind (&RouteUI::solo_changed, this, _1)); - _route->processors_changed.connect (*this, boost::bind (&RouteTimeAxisView::processors_changed, this, _1)); - _route->NameChanged.connect (*this, boost::bind (&RouteTimeAxisView::route_name_changed, this)); - _route->solo_isolated_changed.connect (*this, boost::bind (&RouteUI::solo_changed, this, _1)); + _route->mute_changed.connect (*this, ui_bind (&RouteUI::mute_changed, this, _1), gui_context()); + _route->solo_changed.connect (*this, ui_bind (&RouteUI::solo_changed, this, _1), gui_context()); + _route->processors_changed.connect (*this, ui_bind (&RouteTimeAxisView::processors_changed, this, _1), gui_context()); + _route->NameChanged.connect (*this, boost::bind (&RouteTimeAxisView::route_name_changed, this), gui_context()); + _route->solo_isolated_changed.connect (*this, ui_bind (&RouteUI::solo_changed, this, _1), gui_context()); if (is_track()) { - track()->TrackModeChanged.connect (*this, boost::bind (&RouteTimeAxisView::track_mode_changed, this)); - track()->FreezeChange.connect (*this, boost::bind (&RouteTimeAxisView::map_frozen, this)); - track()->DiskstreamChanged.connect (*this, boost::bind (&RouteTimeAxisView::diskstream_changed, this)); - get_diskstream()->SpeedChanged.connect (*this, boost::bind (&RouteTimeAxisView::speed_changed, this)); + track()->TrackModeChanged.connect (*this, boost::bind (&RouteTimeAxisView::track_mode_changed, this), gui_context()); + track()->FreezeChange.connect (*this, boost::bind (&RouteTimeAxisView::map_frozen, this), gui_context()); + track()->DiskstreamChanged.connect (*this, boost::bind (&RouteTimeAxisView::diskstream_changed, this), gui_context()); + get_diskstream()->SpeedChanged.connect (*this, boost::bind (&RouteTimeAxisView::speed_changed, this), gui_context()); /* pick up the correct freeze state */ map_frozen (); @@ -532,7 +532,7 @@ RouteTimeAxisView::build_display_menu () if (!Profile->get_sae()) { items.push_back (MenuElem (_("Alignment"), *alignment_menu)); - get_diskstream()->AlignmentStyleChanged.connect (route_connections, boost::bind (&RouteTimeAxisView::align_style_changed, this)); + get_diskstream()->AlignmentStyleChanged.connect (route_connections, boost::bind (&RouteTimeAxisView::align_style_changed, this), gui_context()); RadioMenuItem::Group mode_group; items.push_back (RadioMenuElem (mode_group, _("Normal mode"), sigc::bind ( @@ -564,7 +564,7 @@ RouteTimeAxisView::build_display_menu () } } - get_diskstream()->AlignmentStyleChanged.connect (route_connections, boost::bind (&RouteTimeAxisView::align_style_changed, this)); + get_diskstream()->AlignmentStyleChanged.connect (route_connections, boost::bind (&RouteTimeAxisView::align_style_changed, this), gui_context()); mode_menu = build_mode_menu(); if (mode_menu) diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index 3eb72a9b53..d84cc8ba36 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -136,11 +136,11 @@ RouteUI::init () show_sends_button->set_self_managed (true); UI::instance()->set_tip (show_sends_button, _("make mixer strips show sends to this bus"), ""); - _session->SoloChanged.connect (_session_connections, sigc::mem_fun(*this, &RouteUI::solo_changed_so_update_mute)); - _session->TransportStateChange.connect (_session_connections, sigc::mem_fun (*this, &RouteUI::check_rec_enable_sensitivity)); - _session->RecordStateChanged.connect (_session_connections, boost::bind (&RouteUI::session_rec_enable_changed, this)); + _session->SoloChanged.connect (_session_connections, boost::bind (&RouteUI::solo_changed_so_update_mute, this), gui_context()); + _session->TransportStateChange.connect (_session_connections, boost::bind (&RouteUI::check_rec_enable_sensitivity, this), gui_context()); + _session->RecordStateChanged.connect (_session_connections, boost::bind (&RouteUI::session_rec_enable_changed, this), gui_context()); - Config->ParameterChanged.connect (*this, boost::bind (&RouteUI::parameter_changed, this, _1)); + Config->ParameterChanged.connect (*this, ui_bind (&RouteUI::parameter_changed, this, _1), gui_context()); } void @@ -188,22 +188,22 @@ RouteUI::set_route (boost::shared_ptr<Route> rp) } if (self_destruct) { - rp->GoingAway.connect (route_connections, boost::bind (&RouteUI::self_delete, this)); + rp->GoingAway.connect (route_connections, boost::bind (&RouteUI::self_delete, this), gui_context()); } mute_button->set_controllable (_route->mute_control()); solo_button->set_controllable (_route->solo_control()); - _route->active_changed.connect (route_connections, boost::bind (&RouteUI::route_active_changed, this)); - _route->mute_changed.connect (route_connections, boost::bind (&RouteUI::mute_changed, this, _1)); - _route->solo_changed.connect (route_connections, boost::bind (&RouteUI::solo_changed, this, _1)); - _route->listen_changed.connect (route_connections, boost::bind (&RouteUI::listen_changed, this, _1)); - _route->solo_isolated_changed.connect (route_connections, boost::bind (&RouteUI::solo_changed, this, _1)); + _route->active_changed.connect (route_connections, boost::bind (&RouteUI::route_active_changed, this), gui_context()); + _route->mute_changed.connect (route_connections, ui_bind (&RouteUI::mute_changed, this, _1), gui_context()); + _route->solo_changed.connect (route_connections, ui_bind (&RouteUI::solo_changed, this, _1), gui_context()); + _route->listen_changed.connect (route_connections, ui_bind (&RouteUI::listen_changed, this, _1), gui_context()); + _route->solo_isolated_changed.connect (route_connections, ui_bind (&RouteUI::solo_changed, this, _1), gui_context()); if (_session->writable() && is_track()) { boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route); - t->diskstream()->RecordEnableChanged.connect (route_connections, boost::bind (&RouteUI::route_rec_enable_changed, this)); + t->diskstream()->RecordEnableChanged.connect (route_connections, boost::bind (&RouteUI::route_rec_enable_changed, this), gui_context()); rec_enable_button->show(); rec_enable_button->set_controllable (t->rec_enable_control()); @@ -893,14 +893,14 @@ RouteUI::build_solo_menu (void) check = new CheckMenuItem(_("Solo Isolate")); check->set_active (_route->solo_isolated()); check->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_solo_isolated), check)); - _route->solo_isolated_changed.connect (route_connections, boost::bind (&RouteUI::solo_isolated_toggle, this, _1, check)); + _route->solo_isolated_changed.connect (route_connections, ui_bind (&RouteUI::solo_isolated_toggle, this, _1, check), gui_context()); items.push_back (CheckMenuElem(*check)); check->show_all(); check = new CheckMenuItem(_("Solo Safe")); check->set_active (_route->solo_safe()); check->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_solo_safe), check)); - _route->solo_safe_changed.connect (route_connections, boost::bind (&RouteUI::solo_safe_toggle, this, _1, check)); + _route->solo_safe_changed.connect (route_connections, ui_bind (&RouteUI::solo_safe_toggle, this, _1, check), gui_context()); items.push_back (CheckMenuElem(*check)); check->show_all(); @@ -946,7 +946,7 @@ RouteUI::build_mute_menu(void) //items.push_back (SeparatorElem()); // items.push_back (MenuElem (_("MIDI Bind"), sigc::mem_fun (*mute_button, &BindableToggleButton::midi_learn))); - _route->mute_points_changed.connect (route_connections, boost::bind (&RouteUI::muting_change, this)); + _route->mute_points_changed.connect (route_connections, boost::bind (&RouteUI::muting_change, this), gui_context()); } void diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc index 05cd154831..edba77140d 100644 --- a/gtk2_ardour/selection.cc +++ b/gtk2_ardour/selection.cc @@ -25,6 +25,7 @@ #include "ardour/playlist.h" #include "ardour/rc_configuration.h" +#include "gui_thread.h" #include "midi_cut_buffer.h" #include "region_view.h" #include "selection.h" @@ -209,7 +210,7 @@ Selection::toggle (TimeAxisView* track) if ((i = find (tracks.begin(), tracks.end(), track)) == tracks.end()) { void (Selection::*pmf)(TimeAxisView*) = &Selection::remove; - track->GoingAway.connect (*this, boost::bind (pmf, this, track)); + track->GoingAway.connect (*this, boost::bind (pmf, this, track), gui_context()); tracks.push_back (track); } else { tracks.erase (i); @@ -338,7 +339,7 @@ Selection::add (const TrackViewList& track_list) for (list<TimeAxisView*>::const_iterator i = added.begin(); i != added.end(); ++i) { void (Selection::*pmf)(TimeAxisView*) = &Selection::remove; - (*i)->GoingAway.connect (*this, boost::bind (pmf, this, (*i))); + (*i)->GoingAway.connect (*this, boost::bind (pmf, this, (*i)), gui_context()); } if (!added.empty()) { @@ -949,7 +950,7 @@ Selection::add (Marker* m) void (Selection::*pmf)(Marker*) = &Selection::remove; - m->GoingAway.connect (*this, boost::bind (pmf, this, m)); + m->GoingAway.connect (*this, boost::bind (pmf, this, m), gui_context()); markers.push_back (m); MarkersChanged(); diff --git a/gtk2_ardour/send_ui.cc b/gtk2_ardour/send_ui.cc index 4c1bb9fec3..0b24587651 100644 --- a/gtk2_ardour/send_ui.cc +++ b/gtk2_ardour/send_ui.cc @@ -61,8 +61,8 @@ SendUI::SendUI (Gtk::Window* parent, boost::shared_ptr<Send> s, Session* session _send->set_metering (true); - _send->input()->changed.connect (connections, boost::bind (&SendUI::ins_changed, this, _1, _2)); - _send->output()->changed.connect (connections, boost::bind (&SendUI::outs_changed, this, _1, _2)); + _send->input()->changed.connect (connections, ui_bind (&SendUI::ins_changed, this, _1, _2), gui_context()); + _send->output()->changed.connect (connections, ui_bind (&SendUI::outs_changed, this, _1, _2), gui_context()); _panners.set_width (Wide); _panners.setup_pan (); @@ -130,7 +130,7 @@ SendUIWindow::SendUIWindow (boost::shared_ptr<Send> s, Session* session) set_name ("SendUIWindow"); - s->GoingAway.connect (going_away_connection, boost::bind (&SendUIWindow::send_going_away, this)); + s->GoingAway.connect (going_away_connection, boost::bind (&SendUIWindow::send_going_away, this), gui_context()); signal_delete_event().connect (sigc::bind ( sigc::ptr_fun (just_hide_it), diff --git a/gtk2_ardour/send_ui.h b/gtk2_ardour/send_ui.h index 2c71466518..171b913702 100644 --- a/gtk2_ardour/send_ui.h +++ b/gtk2_ardour/send_ui.h @@ -71,7 +71,7 @@ class SendUIWindow : public ArdourDialog Gtk::HBox hpacker; void send_going_away (); - boost::signals2::scoped_connection going_away_connection; + PBD::ScopedConnection going_away_connection; }; #endif /* __ardour_gtk_send_ui_h__ */ diff --git a/gtk2_ardour/session_import_dialog.cc b/gtk2_ardour/session_import_dialog.cc index 5b6b8a71b4..675a3b0603 100644 --- a/gtk2_ardour/session_import_dialog.cc +++ b/gtk2_ardour/session_import_dialog.cc @@ -30,6 +30,7 @@ #include <gtkmm2ext/utils.h> +#include "gui_thread.h" #include "prompter.h" #include "i18n.h" @@ -91,10 +92,10 @@ SessionImportDialog::SessionImportDialog (ARDOUR::Session* target) : ok_button = add_button (_("Import"), Gtk::RESPONSE_ACCEPT); ok_button->signal_clicked().connect (sigc::mem_fun (*this, &SessionImportDialog::do_merge)); - // prompt signals - ElementImporter::Rename.connect (connections, boost::bind (&SessionImportDialog::open_rename_dialog, this, _1, _2)); - ElementImporter::Prompt.connect (connections, boost::bind (&SessionImportDialog::open_prompt_dialog, this, _1)); - + // prompt signals XXX: problem - handlers to be in the same thread since they return values + ElementImporter::Rename.connect_same_thread (connections, boost::bind (&SessionImportDialog::open_rename_dialog, this, _1, _2)); + ElementImporter::Prompt.connect_same_thread (connections, boost::bind (&SessionImportDialog::open_prompt_dialog, this, _1)); + // Finalize show_all(); } diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc index 2cc6e253ba..2fb6328c1c 100644 --- a/gtk2_ardour/session_option_editor.cc +++ b/gtk2_ardour/session_option_editor.cc @@ -3,6 +3,8 @@ #include "ardour/auditioner.h" #include "ardour/audioengine.h" #include "ardour/port.h" + +#include "gui_thread.h" #include "session_option_editor.h" #include "port_matrix.h" #include "i18n.h" @@ -160,9 +162,9 @@ SessionOptionEditor::SessionOptionEditor (Session* s) sigc::mem_fun (*_session_config, &SessionConfiguration::set_sync_source) ); - s->MTC_PortChanged.connect (_session_connections, boost::bind (&SessionOptionEditor::populate_sync_options, this, s, ssrc)); - s->MIDIClock_PortChanged.connect (_session_connections, boost::bind (&SessionOptionEditor::populate_sync_options, this, s, ssrc)); - s->config.ParameterChanged.connect (_session_connections, boost::bind (&SessionOptionEditor::follow_sync_state, this, _1, s, ssrc)); + s->MTC_PortChanged.connect (_session_connections, boost::bind (&SessionOptionEditor::populate_sync_options, this, s, ssrc), gui_context()); + s->MIDIClock_PortChanged.connect (_session_connections, boost::bind (&SessionOptionEditor::populate_sync_options, this, s, ssrc), gui_context()); + s->config.ParameterChanged.connect (_session_connections, ui_bind (&SessionOptionEditor::follow_sync_state, this, _1, s, ssrc), gui_context()); populate_sync_options (s, ssrc); follow_sync_state (string ("external-sync"), s, ssrc); diff --git a/gtk2_ardour/splash.cc b/gtk2_ardour/splash.cc index 6489efcdf7..910e996702 100644 --- a/gtk2_ardour/splash.cc +++ b/gtk2_ardour/splash.cc @@ -56,7 +56,7 @@ Splash::Splash () set_default_size (pixbuf->get_width(), pixbuf->get_height()); the_splash = this; - ARDOUR::BootMessage.connect (msg_connection, boost::bind (&Splash::boot_message, this, _1)); + ARDOUR::BootMessage.connect (msg_connection, ui_bind (&Splash::boot_message, this, _1), gui_context()); } void diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index 39f98582c7..a29ad7b4cc 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -79,12 +79,12 @@ StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Group* group) canvas_rect, &_trackview)); if (_trackview.is_track()) { - _trackview.track()->DiskstreamChanged.connect (*this, boost::bind (&StreamView::diskstream_changed, this)); - _trackview.get_diskstream()->RecordEnableChanged.connect (*this, boost::bind (&StreamView::rec_enable_changed, this)); + _trackview.track()->DiskstreamChanged.connect (*this, boost::bind (&StreamView::diskstream_changed, this), gui_context()); + _trackview.get_diskstream()->RecordEnableChanged.connect (*this, boost::bind (&StreamView::rec_enable_changed, this), gui_context()); - _trackview.session()->TransportStateChange.connect (*this, boost::bind (&StreamView::transport_changed, this)); - _trackview.session()->TransportLooped.connect (*this, boost::bind (&StreamView::transport_looped, this)); - _trackview.session()->RecordStateChanged.connect (*this, boost::bind (&StreamView::sess_rec_enable_changed, this)); + _trackview.session()->TransportStateChange.connect (*this, boost::bind (&StreamView::transport_changed, this), gui_context()); + _trackview.session()->TransportLooped.connect (*this, boost::bind (&StreamView::transport_looped, this), gui_context()); + _trackview.session()->RecordStateChanged.connect (*this, boost::bind (&StreamView::sess_rec_enable_changed, this), gui_context()); } ColorsChanged.connect (sigc::mem_fun (*this, &StreamView::color_handler)); @@ -231,7 +231,7 @@ StreamView::display_diskstream (boost::shared_ptr<Diskstream> ds) { playlist_change_connection.disconnect(); playlist_changed (ds); - ds->PlaylistChanged.connect (playlist_change_connection, boost::bind (&StreamView::playlist_changed_weak, this, boost::weak_ptr<Diskstream> (ds))); + ds->PlaylistChanged.connect (playlist_change_connection, boost::bind (&StreamView::playlist_changed_weak, this, boost::weak_ptr<Diskstream> (ds)), gui_context()); } void @@ -353,9 +353,9 @@ StreamView::playlist_changed (boost::shared_ptr<Diskstream> ds) /* catch changes */ - ds->playlist()->Modified.connect (playlist_connections, boost::bind (&StreamView::playlist_modified_weak, this, ds)); - ds->playlist()->RegionAdded.connect (playlist_connections, boost::bind (&StreamView::add_region_view_weak, this, _1)); - ds->playlist()->RegionRemoved.connect (playlist_connections, boost::bind (&StreamView::remove_region_view, this, _1)); + ds->playlist()->Modified.connect (playlist_connections, boost::bind (&StreamView::playlist_modified_weak, this, ds), gui_context()); + ds->playlist()->RegionAdded.connect (playlist_connections, ui_bind (&StreamView::add_region_view_weak, this, _1), gui_context()); + ds->playlist()->RegionRemoved.connect (playlist_connections, ui_bind (&StreamView::remove_region_view, this, _1), gui_context()); } void diff --git a/gtk2_ardour/streamview.h b/gtk2_ardour/streamview.h index effb9431d0..d28dc37133 100644 --- a/gtk2_ardour/streamview.h +++ b/gtk2_ardour/streamview.h @@ -161,7 +161,7 @@ protected: uint32_t stream_base_color; ///< Background color PBD::ScopedConnectionList playlist_connections; - boost::signals2::scoped_connection playlist_change_connection; + PBD::ScopedConnection playlist_change_connection; ARDOUR::layer_t _layers; LayerDisplay _layer_display; diff --git a/gtk2_ardour/strip_silence_dialog.cc b/gtk2_ardour/strip_silence_dialog.cc index ab1297d6bc..3592668cf8 100644 --- a/gtk2_ardour/strip_silence_dialog.cc +++ b/gtk2_ardour/strip_silence_dialog.cc @@ -22,8 +22,10 @@ #include <gtkmm/stock.h> #include "ardour/audioregion.h" #include "ardour/audiosource.h" + #include "ardour/dB.h" #include "ardour_ui.h" +#include "gui_thread.h" #include "strip_silence_dialog.h" #include "canvas_impl.h" #include "waveview.h" @@ -129,7 +131,7 @@ StripSilenceDialog::create_waves () int n = 0; for (std::list<Wave>::iterator i = _waves.begin(); i != _waves.end(); ++i) { - if (i->region->audio_source(0)->peaks_ready (boost::bind (&StripSilenceDialog::peaks_ready, this), _peaks_ready_connection)) { + if (i->region->audio_source(0)->peaks_ready (boost::bind (&StripSilenceDialog::peaks_ready, this), _peaks_ready_connection, gui_context())) { i->view = new WaveView (*(_canvas->root())); i->view->property_data_src() = static_cast<gpointer>(i->region.get()); i->view->property_cache() = WaveView::create_cache (); diff --git a/gtk2_ardour/strip_silence_dialog.h b/gtk2_ardour/strip_silence_dialog.h index f79abb8eb9..927764e57c 100644 --- a/gtk2_ardour/strip_silence_dialog.h +++ b/gtk2_ardour/strip_silence_dialog.h @@ -66,5 +66,5 @@ private: int _wave_width; int _wave_height; - boost::signals2::scoped_connection _peaks_ready_connection; + PBD::ScopedConnection _peaks_ready_connection; }; diff --git a/gtk2_ardour/tape_region_view.cc b/gtk2_ardour/tape_region_view.cc index 6fd2570c27..31baf17234 100644 --- a/gtk2_ardour/tape_region_view.cc +++ b/gtk2_ardour/tape_region_view.cc @@ -71,7 +71,7 @@ TapeAudioRegionView::init (Gdk::Color const & basic_color, bool /*wfw*/) /* every time the wave data changes and peaks are ready, redraw */ for (uint32_t n = 0; n < audio_region()->n_channels(); ++n) { - audio_region()->audio_source(n)->PeaksReady.connect (*this, boost::bind (&TapeAudioRegionView::update, this, n)); + audio_region()->audio_source(n)->PeaksReady.connect (*this, boost::bind (&TapeAudioRegionView::update, this, n), gui_context()); } } diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index d3e3e88003..cac49687a3 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -40,6 +40,7 @@ #include "ardour/location.h" #include "ardour_ui.h" +#include "gui_thread.h" #include "public_editor.h" #include "time_axis_view.h" #include "region_view.h" @@ -924,7 +925,7 @@ TimeAxisView::add_ghost (RegionView* rv) if(gr) { ghosts.push_back(gr); - gr->GoingAway.connect (*this, boost::bind (&TimeAxisView::erase_ghost, this, _1)); + gr->GoingAway.connect (*this, ui_bind (&TimeAxisView::erase_ghost, this, _1), gui_context()); } } diff --git a/libs/ardour/ardour/audiosource.h b/libs/ardour/ardour/audiosource.h index 4f46451907..45f62fc7b9 100644 --- a/libs/ardour/ardour/audiosource.h +++ b/libs/ardour/ardour/audiosource.h @@ -72,7 +72,7 @@ class AudioSource : virtual public Source, sframes_t start, nframes_t cnt, double samples_per_visual_peak) const; int build_peaks (); - bool peaks_ready (boost::function<void()> callWhenReady, PBD::Connection& connection_created_if_not_ready) const; + bool peaks_ready (boost::function<void()> callWhenReady, PBD::Connection& connection_created_if_not_ready, PBD::EventLoop* event_loop) const; mutable PBD::Signal0<void> PeaksReady; mutable PBD::Signal2<void,nframes_t,nframes_t> PeakRangeReady; diff --git a/libs/ardour/ardour/midi_ui.h b/libs/ardour/ardour/midi_ui.h index c21182f4e2..819b70df43 100644 --- a/libs/ardour/ardour/midi_ui.h +++ b/libs/ardour/ardour/midi_ui.h @@ -30,6 +30,8 @@ class MidiControlUI : public AbstractUI<MidiUIRequest> public: MidiControlUI (Session& s); ~MidiControlUI (); + + static MidiControlUI* instance() { return _instance; } static BaseUI::RequestType PortChange; @@ -48,6 +50,8 @@ class MidiControlUI : public AbstractUI<MidiUIRequest> bool midi_input_handler (Glib::IOCondition, MIDI::Port*); void reset_ports (); void clear_ports (); + + static MidiControlUI* _instance; }; } diff --git a/libs/ardour/ardour/session_event.h b/libs/ardour/ardour/session_event.h index 66c8720186..2ce2d5225a 100644 --- a/libs/ardour/ardour/session_event.h +++ b/libs/ardour/ardour/session_event.h @@ -7,7 +7,7 @@ #include "pbd/pool.h" #include "pbd/ringbuffer.h" -#include "pbd/ui_callback.h" +#include "pbd/event_loop.h" #include "ardour/types.h" @@ -73,7 +73,7 @@ struct SessionEvent { boost::shared_ptr<RouteList> routes; /* apply to */ boost::function<void (void)> rt_slot; /* what to call in RT context */ RTeventCallback rt_return; /* called after rt_slot, with this event as an argument */ - PBD::UICallback* ui; + PBD::EventLoop* event_loop; std::list<AudioRange> audio_range; std::list<MusicRange> music_range; @@ -88,7 +88,7 @@ struct SessionEvent { , speed (spd) , yes_or_no (yn) , second_yes_or_no (yn2) - , ui (0) {} + , event_loop (0) {} void set_ptr (void* p) { ptr = p; diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index f60d16391f..f8dc553ae0 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -44,6 +44,7 @@ #include "ardour/audio_port.h" #include "ardour/audioengine.h" #include "ardour/audiofilesource.h" + #include "ardour/audioplaylist.h" #include "ardour/audioregion.h" #include "ardour/butler.h" @@ -1504,7 +1505,7 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca continue; /* XXX is this OK? */ } - region->GoingAway.connect (*this, boost::bind (&Diskstream::remove_region_from_last_capture, this, boost::weak_ptr<Region>(region))); + region->GoingAway.connect_same_thread (*this, boost::bind (&Diskstream::remove_region_from_last_capture, this, boost::weak_ptr<Region>(region))); _last_capture_regions.push_back (region); diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc index 85c3ffe1b2..3379868d60 100644 --- a/libs/ardour/audio_playlist.cc +++ b/libs/ardour/audio_playlist.cc @@ -528,8 +528,8 @@ AudioPlaylist::add_crossfade (boost::shared_ptr<Crossfade> xfade) } else { _crossfades.push_back (xfade); - xfade->Invalidated.connect (*this, boost::bind (&AudioPlaylist::crossfade_invalidated, this, _1)); - xfade->StateChanged.connect (*this, boost::bind (&AudioPlaylist::crossfade_changed, this, _1)); + xfade->Invalidated.connect_same_thread (*this, boost::bind (&AudioPlaylist::crossfade_invalidated, this, _1)); + xfade->StateChanged.connect_same_thread (*this, boost::bind (&AudioPlaylist::crossfade_changed, this, _1)); notify_crossfade_added (xfade); } @@ -584,8 +584,8 @@ AudioPlaylist::set_state (const XMLNode& node, int version) try { boost::shared_ptr<Crossfade> xfade = boost::shared_ptr<Crossfade> (new Crossfade (*((const Playlist *)this), *child)); _crossfades.push_back (xfade); - xfade->Invalidated.connect (*this, boost::bind (&AudioPlaylist::crossfade_invalidated, this, _1)); - xfade->StateChanged.connect (*this, boost::bind (&AudioPlaylist::crossfade_changed, this, _1)); + xfade->Invalidated.connect_same_thread (*this, boost::bind (&AudioPlaylist::crossfade_invalidated, this, _1)); + xfade->StateChanged.connect_same_thread (*this, boost::bind (&AudioPlaylist::crossfade_changed, this, _1)); NewCrossfade(xfade); } diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index 19b5bd7be5..502c3a7220 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -182,7 +182,7 @@ AudioTrack::set_diskstream (boost::shared_ptr<AudioDiskstream> ds, void * /*src* if (audio_diskstream()->deprecated_io_node) { if (!IO::connecting_legal) { - IO::ConnectingLegal.connect (*this, boost::bind (&AudioTrack::deprecated_use_diskstream_connections, this)); + IO::ConnectingLegal.connect_same_thread (*this, boost::bind (&AudioTrack::deprecated_use_diskstream_connections, this)); } else { deprecated_use_diskstream_connections (); } @@ -304,7 +304,7 @@ AudioTrack::_set_state (const XMLNode& node, int version, bool call_base) pending_state = const_cast<XMLNode*> (&node); if (_session.state_of_the_state() & Session::Loading) { - _session.StateReady.connect (*this, boost::bind (&AudioTrack::set_state_part_two, this)); + _session.StateReady.connect_same_thread (*this, boost::bind (&AudioTrack::set_state_part_two, this)); } else { set_state_part_two (); } diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index cce7869072..24febdd86a 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -96,7 +96,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, n { boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src); if (afs) { - afs->HeaderPositionOffsetChanged.connect (*this, boost::bind (&AudioRegion::source_offset_changed, this)); + afs->HeaderPositionOffsetChanged.connect_same_thread (*this, boost::bind (&AudioRegion::source_offset_changed, this)); } init (); @@ -113,7 +113,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, n { boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src); if (afs) { - afs->HeaderPositionOffsetChanged.connect (*this, boost::bind (&AudioRegion::source_offset_changed, this)); + afs->HeaderPositionOffsetChanged.connect_same_thread (*this, boost::bind (&AudioRegion::source_offset_changed, this)); } init (); @@ -205,7 +205,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, const Sour boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> ((*i)); if (afs) { - afs->HeaderPositionOffsetChanged.connect (*this, boost::bind (&AudioRegion::source_offset_changed, this)); + afs->HeaderPositionOffsetChanged.connect_same_thread (*this, boost::bind (&AudioRegion::source_offset_changed, this)); } } @@ -229,7 +229,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, const XMLNode& nod { boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src); if (afs) { - afs->HeaderPositionOffsetChanged.connect (*this, boost::bind (&AudioRegion::source_offset_changed, this)); + afs->HeaderPositionOffsetChanged.connect_same_thread (*this, boost::bind (&AudioRegion::source_offset_changed, this)); } init (); @@ -270,7 +270,7 @@ void AudioRegion::connect_to_analysis_changed () { for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) { - (*i)->AnalysisChanged.connect (*this, boost::bind (&AudioRegion::invalidate_transients, this)); + (*i)->AnalysisChanged.connect_same_thread (*this, boost::bind (&AudioRegion::invalidate_transients, this)); } } @@ -285,7 +285,7 @@ AudioRegion::connect_to_header_position_offset_changed () unique_srcs.insert (*i); boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (*i); if (afs) { - afs->HeaderPositionOffsetChanged.connect (*this, boost::bind (&AudioRegion::source_offset_changed, this)); + afs->HeaderPositionOffsetChanged.connect_same_thread (*this, boost::bind (&AudioRegion::source_offset_changed, this)); } } } @@ -294,9 +294,9 @@ AudioRegion::connect_to_header_position_offset_changed () void AudioRegion::listen_to_my_curves () { - _envelope->StateChanged.connect (*this, boost::bind (&AudioRegion::envelope_changed, this)); - _fade_in->StateChanged.connect (*this, boost::bind (&AudioRegion::fade_in_changed, this)); - _fade_out->StateChanged.connect (*this, boost::bind (&AudioRegion::fade_out_changed, this)); + _envelope->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::envelope_changed, this)); + _fade_in->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::fade_in_changed, this)); + _fade_out->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::fade_out_changed, this)); } void diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc index 5fcabb0c77..0c820eed4d 100644 --- a/libs/ardour/audiosource.cc +++ b/libs/ardour/audiosource.cc @@ -149,7 +149,7 @@ AudioSource::update_length (sframes_t pos, sframes_t cnt) ***********************************************************************/ bool -AudioSource::peaks_ready (boost::function<void()> doThisWhenReady, Connection& connect_here_if_not) const +AudioSource::peaks_ready (boost::function<void()> doThisWhenReady, Connection& connect_here_if_not, EventLoop* event_loop) const { bool ret; Glib::Mutex::Lock lm (_peaks_ready_lock); @@ -159,7 +159,7 @@ AudioSource::peaks_ready (boost::function<void()> doThisWhenReady, Connection& c */ if (!(ret = _peaks_built)) { - PeaksReady.connect (connect_here_if_not, doThisWhenReady); + PeaksReady.connect (connect_here_if_not, doThisWhenReady, event_loop); } return ret; diff --git a/libs/ardour/auditioner.cc b/libs/ardour/auditioner.cc index 1e28ebc8b4..82ec91cafd 100644 --- a/libs/ardour/auditioner.cc +++ b/libs/ardour/auditioner.cc @@ -72,7 +72,7 @@ Auditioner::Auditioner (Session& s) _main_outs->allow_pan_reset (); _main_outs->reset_panner (); - _output->changed.connect (*this, boost::bind (&Auditioner::output_changed, this, _1, _2)); + _output->changed.connect_same_thread (*this, boost::bind (&Auditioner::output_changed, this, _1, _2)); the_region.reset ((AudioRegion*) 0); g_atomic_int_set (&_active, 0); diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 1438f93722..902dbc9705 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -64,10 +64,10 @@ Delivery::Delivery (Session& s, boost::shared_ptr<IO> io, boost::shared_ptr<Mute _display_to_user = false; if (_output) { - _output->changed.connect (*this, boost::bind (&Delivery::output_changed, this, _1, _2)); + _output->changed.connect_same_thread (*this, boost::bind (&Delivery::output_changed, this, _1, _2)); } - CycleStart.connect (*this, boost::bind (&Delivery::cycle_start, this, _1)); + CycleStart.connect_same_thread (*this, boost::bind (&Delivery::cycle_start, this, _1)); } /* deliver to a new IO object */ @@ -88,10 +88,10 @@ Delivery::Delivery (Session& s, boost::shared_ptr<MuteMaster> mm, const string& _display_to_user = false; if (_output) { - _output->changed.connect (*this, boost::bind (&Delivery::output_changed, this, _1, _2)); + _output->changed.connect_same_thread (*this, boost::bind (&Delivery::output_changed, this, _1, _2)); } - CycleStart.connect (*this, boost::bind (&Delivery::cycle_start, this, _1)); + CycleStart.connect_same_thread (*this, boost::bind (&Delivery::cycle_start, this, _1)); } /* deliver to a new IO object, reconstruct from XML */ @@ -116,10 +116,10 @@ Delivery::Delivery (Session& s, boost::shared_ptr<MuteMaster> mm, const XMLNode& } if (_output) { - _output->changed.connect (*this, boost::bind (&Delivery::output_changed, this, _1, _2)); + _output->changed.connect_same_thread (*this, boost::bind (&Delivery::output_changed, this, _1, _2)); } - CycleStart.connect (*this, boost::bind (&Delivery::cycle_start, this, _1)); + CycleStart.connect_same_thread (*this, boost::bind (&Delivery::cycle_start, this, _1)); } /* deliver to an existing IO object, reconstruct from XML */ @@ -144,10 +144,10 @@ Delivery::Delivery (Session& s, boost::shared_ptr<IO> out, boost::shared_ptr<Mut } if (_output) { - _output->changed.connect (*this, boost::bind (&Delivery::output_changed, this, _1, _2)); + _output->changed.connect_same_thread (*this, boost::bind (&Delivery::output_changed, this, _1, _2)); } - CycleStart.connect (*this, boost::bind (&Delivery::cycle_start, this, _1)); + CycleStart.connect_same_thread (*this, boost::bind (&Delivery::cycle_start, this, _1)); } std::string @@ -419,7 +419,7 @@ Delivery::reset_panner () } } else { panner_legal_c.disconnect (); - PannersLegal.connect (panner_legal_c, boost::bind (&Delivery::panners_became_legal, this)); + PannersLegal.connect_same_thread (panner_legal_c, boost::bind (&Delivery::panners_became_legal, this)); } } diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index 8af85a553c..a37323de84 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -142,13 +142,13 @@ Diskstream::set_route (Route& r) _io = _route->input(); ic_connection.disconnect(); - _io->changed.connect (ic_connection, boost::bind (&Diskstream::handle_input_change, this, _1, _2)); + _io->changed.connect_same_thread (ic_connection, boost::bind (&Diskstream::handle_input_change, this, _1, _2)); input_change_pending = ConfigurationChanged; non_realtime_input_change (); set_align_style_from_io (); - _route->GoingAway.connect (*this, boost::bind (&Diskstream::route_going_away, this)); + _route->GoingAway.connect_same_thread (*this, boost::bind (&Diskstream::route_going_away, this)); } void @@ -339,9 +339,9 @@ Diskstream::use_playlist (boost::shared_ptr<Playlist> playlist) reset_write_sources (false); } - _playlist->Modified.connect (playlist_connections, boost::bind (&Diskstream::playlist_modified, this)); - _playlist->GoingAway.connect (playlist_connections, boost::bind (&Diskstream::playlist_deleted, this, boost::weak_ptr<Playlist>(_playlist))); - _playlist->RangesMoved.connect (playlist_connections, boost::bind (&Diskstream::playlist_ranges_moved, this, _1)); + _playlist->Modified.connect_same_thread (playlist_connections, boost::bind (&Diskstream::playlist_modified, this)); + _playlist->GoingAway.connect_same_thread (playlist_connections, boost::bind (&Diskstream::playlist_deleted, this, boost::weak_ptr<Playlist>(_playlist))); + _playlist->RangesMoved.connect_same_thread (playlist_connections, boost::bind (&Diskstream::playlist_ranges_moved, this, _1)); } /* don't do this if we've already asked for it *or* if we are setting up diff --git a/libs/ardour/export_channel.cc b/libs/ardour/export_channel.cc index dfe038734b..80e672038e 100644 --- a/libs/ardour/export_channel.cc +++ b/libs/ardour/export_channel.cc @@ -108,7 +108,7 @@ RegionExportChannelFactory::RegionExportChannelFactory (Session * session, Audio throw ExportFailed ("Unhandled type in ExportChannelFactory constructor"); } - session->ProcessExport.connect (export_connection, boost::bind (&RegionExportChannelFactory::new_cycle_started, this, _1)); + session->ProcessExport.connect_same_thread (export_connection, boost::bind (&RegionExportChannelFactory::new_cycle_started, this, _1)); buffers.set_count (ChanCount (DataType::AUDIO, n_channels)); buffers.ensure_buffers (DataType::AUDIO, n_channels, frames_per_cycle); diff --git a/libs/ardour/export_format_manager.cc b/libs/ardour/export_format_manager.cc index d25877c5bc..51c1771ae7 100644 --- a/libs/ardour/export_format_manager.cc +++ b/libs/ardour/export_format_manager.cc @@ -211,13 +211,13 @@ void ExportFormatManager::add_compatibility (CompatPtr ptr) { compatibilities.push_back (ptr); - ptr->SelectChanged.connect (*this, boost::bind (&ExportFormatManager::change_compatibility_selection, this, _1, WeakCompatPtr (ptr))); + ptr->SelectChanged.connect_same_thread (*this, boost::bind (&ExportFormatManager::change_compatibility_selection, this, _1, WeakCompatPtr (ptr))); } void ExportFormatManager::add_quality (QualityPtr ptr) { - ptr->SelectChanged.connect (*this, boost::bind (&ExportFormatManager::change_quality_selection, this, _1, WeakQualityPtr (ptr))); + ptr->SelectChanged.connect_same_thread (*this, boost::bind (&ExportFormatManager::change_quality_selection, this, _1, WeakQualityPtr (ptr))); qualities.push_back (ptr); } @@ -225,7 +225,7 @@ void ExportFormatManager::add_format (FormatPtr ptr) { formats.push_back (ptr); - ptr->SelectChanged.connect (*this, boost::bind (&ExportFormatManager::change_format_selection, this, _1, WeakFormatPtr (ptr))); + ptr->SelectChanged.connect_same_thread (*this, boost::bind (&ExportFormatManager::change_format_selection, this, _1, WeakFormatPtr (ptr))); universal_set = universal_set->get_union (*ptr); /* Encoding options */ @@ -233,15 +233,15 @@ ExportFormatManager::add_format (FormatPtr ptr) boost::shared_ptr<HasSampleFormat> hsf; if (hsf = boost::dynamic_pointer_cast<HasSampleFormat> (ptr)) { - hsf->SampleFormatSelectChanged.connect (*this, boost::bind (&ExportFormatManager::change_sample_format_selection, this, _1, _2)); - hsf->DitherTypeSelectChanged.connect (*this, boost::bind (&ExportFormatManager::change_dither_type_selection, this, _1, _2)); + hsf->SampleFormatSelectChanged.connect_same_thread (*this, boost::bind (&ExportFormatManager::change_sample_format_selection, this, _1, _2)); + hsf->DitherTypeSelectChanged.connect_same_thread (*this, boost::bind (&ExportFormatManager::change_dither_type_selection, this, _1, _2)); } } void ExportFormatManager::add_sample_rate (SampleRatePtr ptr) { - ptr->SelectChanged.connect (*this, boost::bind (&ExportFormatManager::change_sample_rate_selection, this, _1, WeakSampleRatePtr (ptr))); + ptr->SelectChanged.connect_same_thread (*this, boost::bind (&ExportFormatManager::change_sample_rate_selection, this, _1, WeakSampleRatePtr (ptr))); sample_rates.push_back (ptr); } diff --git a/libs/ardour/export_formats.cc b/libs/ardour/export_formats.cc index a7dd544d47..eb9be6183b 100644 --- a/libs/ardour/export_formats.cc +++ b/libs/ardour/export_formats.cc @@ -59,10 +59,10 @@ HasSampleFormat::add_sample_format (ExportFormatBase::SampleFormat format) SampleFormatPtr ptr (new SampleFormatState (format, get_sample_format_name (format))); sample_format_states.push_back (ptr); - ptr->SelectChanged.connect (*this, boost::bind (&HasSampleFormat::update_sample_format_selection, this, _1)); + ptr->SelectChanged.connect_same_thread (*this, boost::bind (&HasSampleFormat::update_sample_format_selection, this, _1)); // BOOST SIGNALS how to connect one signal to another - // ptr->SelectChanged.connect (*this, boost::bind (SampleFormatSelectChanged, _1, WeakSampleFormatPtr (ptr)); - // ptr->CompatibleChanged.connect (*this, boost::bind (SampleFormatCompatibleChanged, _1, WeakSampleFormatPtr (ptr)); + // ptr->SelectChanged.connect_same_thread (*this, boost::bind (SampleFormatSelectChanged, _1, WeakSampleFormatPtr (ptr)); + // ptr->CompatibleChanged.connect_same_thread (*this, boost::bind (SampleFormatCompatibleChanged, _1, WeakSampleFormatPtr (ptr)); } void @@ -70,10 +70,10 @@ HasSampleFormat::add_dither_type (ExportFormatBase::DitherType type, Glib::ustri { DitherTypePtr ptr (new DitherTypeState (type, name)); dither_type_states.push_back (ptr); - ptr->SelectChanged.connect (*this, boost::bind (&HasSampleFormat::update_dither_type_selection, this, _1)); + ptr->SelectChanged.connect_same_thread (*this, boost::bind (&HasSampleFormat::update_dither_type_selection, this, _1)); // BOOST SIGNALS how to connect one signal to another - // ptr->SelectChanged.connect (*this, boost::bind (DitherTypeSelectChanged, _1, WeakDitherTypePtr (ptr)); - // ptr->CompatibleChanged.connect (*this, boost::bind (DitherTypeCompatibleChanged, _1, WeakDitherTypePtr (ptr)); + // ptr->SelectChanged.connect_same_thread (*this, boost::bind (DitherTypeSelectChanged, _1, WeakDitherTypePtr (ptr)); + // ptr->CompatibleChanged.connect_same_thread (*this, boost::bind (DitherTypeCompatibleChanged, _1, WeakDitherTypePtr (ptr)); } HasSampleFormat::SampleFormatPtr diff --git a/libs/ardour/export_handler.cc b/libs/ardour/export_handler.cc index a85e41d40a..b78fc20f7e 100644 --- a/libs/ardour/export_handler.cc +++ b/libs/ardour/export_handler.cc @@ -106,7 +106,7 @@ ExportHandler::ExportHandler (Session & session) { processor.reset (new ExportProcessor (session)); - ExportProcessor::WritingFile.connect (files_written_connection, boost::bind (&ExportHandler::add_file, this, _1)); + ExportProcessor::WritingFile.connect_same_thread (files_written_connection, boost::bind (&ExportHandler::add_file, this, _1)); } ExportHandler::~ExportHandler () @@ -168,7 +168,7 @@ ExportHandler::do_export (bool rt) realtime = rt; - session.ExportReadFinished.connect (export_read_finished_connection, boost::bind (&ExportHandler::finish_timespan, this)); + session.ExportReadFinished.connect_same_thread (export_read_finished_connection, boost::bind (&ExportHandler::finish_timespan, this)); start_timespan (); } @@ -505,7 +505,7 @@ ExportHandler::start_timespan () /* connect stuff and start export */ - session.ProcessExport.connect (current_timespan->process_connection, boost::bind (&ExportTimespan::process, current_timespan, _1)); + session.ProcessExport.connect_same_thread (current_timespan->process_connection, boost::bind (&ExportTimespan::process, current_timespan, _1)); session.start_audio_export (current_timespan->get_start(), realtime); } @@ -566,7 +566,7 @@ ExportHandler::timespan_thread_finished () cc = current_map_it->second.channel_config; } - cc->FilesWritten.connect (channel_config_connection, boost::bind (&ExportHandler::timespan_thread_finished, this)); + cc->FilesWritten.connect_same_thread (channel_config_connection, boost::bind (&ExportHandler::timespan_thread_finished, this)); ++current_map_it; } else { /* All files are written from current timespan, reset timespan and start new */ diff --git a/libs/ardour/internal_return.cc b/libs/ardour/internal_return.cc index f42d3c4e80..279472e02d 100644 --- a/libs/ardour/internal_return.cc +++ b/libs/ardour/internal_return.cc @@ -33,14 +33,14 @@ InternalReturn::InternalReturn (Session& s) : Return (s, true) , user_count (0) { - CycleStart.connect (*this, boost::bind (&InternalReturn::cycle_start, this, _1)); + CycleStart.connect_same_thread (*this, boost::bind (&InternalReturn::cycle_start, this, _1)); } InternalReturn::InternalReturn (Session& s, const XMLNode& node) : Return (s, node, true) , user_count (0) { - CycleStart.connect (*this, boost::bind (&InternalReturn::cycle_start, this, _1)); + CycleStart.connect_same_thread (*this, boost::bind (&InternalReturn::cycle_start, this, _1)); } void diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc index 8e9010b148..368eff2be4 100644 --- a/libs/ardour/internal_send.cc +++ b/libs/ardour/internal_send.cc @@ -43,8 +43,8 @@ InternalSend::InternalSend (Session& s, boost::shared_ptr<MuteMaster> mm, boost: set_name (sendto->name()); - _send_to->GoingAway.connect (*this, boost::bind (&InternalSend::send_to_going_away, this)); - _send_to->NameChanged.connect (*this, boost::bind (&InternalSend::send_to_name_changed, this)); + _send_to->GoingAway.connect_same_thread (*this, boost::bind (&InternalSend::send_to_going_away, this)); + _send_to->NameChanged.connect_same_thread (*this, boost::bind (&InternalSend::send_to_name_changed, this)); } InternalSend::InternalSend (Session& s, boost::shared_ptr<MuteMaster> mm, const XMLNode& node) @@ -187,7 +187,7 @@ InternalSend::set_our_state (const XMLNode& node, int /*version*/) */ if (!IO::connecting_legal) { - IO::ConnectingLegal.connect (connect_c, boost::bind (&InternalSend::connect_when_legal, this)); + IO::ConnectingLegal.connect_same_thread (connect_c, boost::bind (&InternalSend::connect_when_legal, this)); } else { connect_when_legal (); } diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index f47e147a18..9066acac91 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -566,7 +566,7 @@ IO::set_state (const XMLNode& node, int version) pending_state_node = new XMLNode (node); pending_state_node_version = version; pending_state_node_in = false; - ConnectingLegal.connect (connection_legal_c, boost::bind (&IO::connecting_became_legal, this)); + ConnectingLegal.connect_same_thread (connection_legal_c, boost::bind (&IO::connecting_became_legal, this)); } @@ -619,7 +619,7 @@ IO::set_state_2X (const XMLNode& node, int version, bool in) pending_state_node = new XMLNode (node); pending_state_node_version = version; pending_state_node_in = in; - ConnectingLegal.connect (connection_legal_c, boost::bind (&IO::connecting_became_legal, this)); + ConnectingLegal.connect_same_thread (connection_legal_c, boost::bind (&IO::connecting_became_legal, this)); } return 0; @@ -1399,7 +1399,7 @@ IO::bundles_connected () IO::UserBundleInfo::UserBundleInfo (IO* io, boost::shared_ptr<UserBundle> b) { bundle = b; - b->Changed.connect (changed, boost::bind (&IO::bundle_changed, io, _1)); + b->Changed.connect_same_thread (changed, boost::bind (&IO::bundle_changed, io, _1)); } std::string diff --git a/libs/ardour/midi_clock_slave.cc b/libs/ardour/midi_clock_slave.cc index 7303059207..3a43580d64 100644 --- a/libs/ardour/midi_clock_slave.cc +++ b/libs/ardour/midi_clock_slave.cc @@ -76,11 +76,11 @@ MIDIClock_Slave::rebind (MIDI::Port& p) std::cerr << "MIDIClock_Slave: connecting to port " << port->name() << std::endl; #endif - port->input()->timing.connect (port_connections, boost::bind (&MIDIClock_Slave::update_midi_clock, this, _1, _2)); - port->input()->start.connect (port_connections, boost::bind (&MIDIClock_Slave::start, this, _1, _2)); - port->input()->contineu.connect (port_connections, boost::bind (&MIDIClock_Slave::contineu, this, _1, _2)); - port->input()->stop.connect (port_connections, boost::bind (&MIDIClock_Slave::stop, this, _1, _2)); - port->input()->position.connect (port_connections, boost::bind (&MIDIClock_Slave::position, this, _1, _2, 3)); + port->input()->timing.connect_same_thread (port_connections, boost::bind (&MIDIClock_Slave::update_midi_clock, this, _1, _2)); + port->input()->start.connect_same_thread (port_connections, boost::bind (&MIDIClock_Slave::start, this, _1, _2)); + port->input()->contineu.connect_same_thread (port_connections, boost::bind (&MIDIClock_Slave::contineu, this, _1, _2)); + port->input()->stop.connect_same_thread (port_connections, boost::bind (&MIDIClock_Slave::stop, this, _1, _2)); + port->input()->position.connect_same_thread (port_connections, boost::bind (&MIDIClock_Slave::position, this, _1, _2, 3)); } void diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index 2320bd4be4..17c1404358 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -1024,7 +1024,7 @@ MidiDiskstream::transport_stopped (struct tm& /*when*/, time_t /*twhen*/, bool a continue; /* XXX is this OK? */ } - region->GoingAway.connect (*this, boost::bind (&Diskstream::remove_region_from_last_capture, this, boost::weak_ptr<Region>(region))); + region->GoingAway.connect_same_thread (*this, boost::bind (&Diskstream::remove_region_from_last_capture, this, boost::weak_ptr<Region>(region))); _last_capture_regions.push_back (region); diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc index b477dbb2f9..7bb995337f 100644 --- a/libs/ardour/midi_region.cc +++ b/libs/ardour/midi_region.cc @@ -52,7 +52,7 @@ MidiRegion::MidiRegion (boost::shared_ptr<MidiSource> src, nframes_t start, nfra : Region (src, start, length, PBD::basename_nosuffix(src->name()), DataType::MIDI, 0, Region::Flag(Region::DefaultFlags|Region::External)) { assert(_name.find("/") == string::npos); - midi_source(0)->Switched.connect (*this, boost::bind (&MidiRegion::switch_source, this, _1)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); } /* Basic MidiRegion constructor (one channel) */ @@ -60,7 +60,7 @@ MidiRegion::MidiRegion (boost::shared_ptr<MidiSource> src, nframes_t start, nfra : Region (src, start, length, name, DataType::MIDI, layer, flags) { assert(_name.find("/") == string::npos); - midi_source(0)->Switched.connect (*this, boost::bind (&MidiRegion::switch_source, this, _1)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); } /* Basic MidiRegion constructor (many channels) */ @@ -68,7 +68,7 @@ MidiRegion::MidiRegion (const SourceList& srcs, nframes_t start, nframes_t lengt : Region (srcs, start, length, name, DataType::MIDI, layer, flags) { assert(_name.find("/") == string::npos); - midi_source(0)->Switched.connect (*this, boost::bind (&MidiRegion::switch_source, this, _1)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); } @@ -77,14 +77,14 @@ MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other, nframes_t off : Region (other, offset, length, name, layer, flags) { assert(_name.find("/") == string::npos); - midi_source(0)->Switched.connect (*this, boost::bind (&MidiRegion::switch_source, this, _1)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); } MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other) : Region (other) { assert(_name.find("/") == string::npos); - midi_source(0)->Switched.connect (*this, boost::bind (&MidiRegion::switch_source, this, _1)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); } MidiRegion::MidiRegion (boost::shared_ptr<MidiSource> src, const XMLNode& node) @@ -94,7 +94,7 @@ MidiRegion::MidiRegion (boost::shared_ptr<MidiSource> src, const XMLNode& node) throw failed_constructor(); } - midi_source(0)->Switched.connect (*this, boost::bind (&MidiRegion::switch_source, this, _1)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); assert(_name.find("/") == string::npos); assert(_type == DataType::MIDI); } @@ -106,7 +106,7 @@ MidiRegion::MidiRegion (const SourceList& srcs, const XMLNode& node) throw failed_constructor(); } - midi_source(0)->Switched.connect (*this, boost::bind (&MidiRegion::switch_source, this, _1)); + midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); assert(_name.find("/") == string::npos); assert(_type == DataType::MIDI); } diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index a6c64c3c30..2fe0616973 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -230,7 +230,7 @@ MidiTrack::_set_state (const XMLNode& node, int version, bool call_base) pending_state = const_cast<XMLNode*> (&node); if (_session.state_of_the_state() & Session::Loading) { - _session.StateReady.connect (*this, boost::bind (&MidiTrack::set_state_part_two, this)); + _session.StateReady.connect_same_thread (*this, boost::bind (&MidiTrack::set_state_part_two, this)); } else { set_state_part_two (); } diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc index 38f856b5a2..70be1f345d 100644 --- a/libs/ardour/midi_ui.cc +++ b/libs/ardour/midi_ui.cc @@ -39,6 +39,7 @@ using namespace Glib; #include "i18n.h" BaseUI::RequestType MidiControlUI::PortChange = BaseUI::new_request_type(); +MidiControlUI* MidiControlUI::_instance = 0; #include "pbd/abstract_ui.cc" /* instantiate the template */ @@ -46,12 +47,14 @@ MidiControlUI::MidiControlUI (Session& s) : AbstractUI<MidiUIRequest> (_("midiui")) , _session (s) { - MIDI::Manager::instance()->PortsChanged.connect (rebind_connection, boost::bind (&MidiControlUI::change_midi_ports, this)); + MIDI::Manager::instance()->PortsChanged.connect_same_thread (rebind_connection, boost::bind (&MidiControlUI::change_midi_ports, this)); + _instance = this; } MidiControlUI::~MidiControlUI () { clear_ports (); + _instance = 0; } void diff --git a/libs/ardour/mtc_slave.cc b/libs/ardour/mtc_slave.cc index 91ac47c883..c713925475 100644 --- a/libs/ardour/mtc_slave.cc +++ b/libs/ardour/mtc_slave.cc @@ -92,9 +92,9 @@ MTC_Slave::rebind (MIDI::Port& p) port = &p; - port->input()->mtc_time.connect (port_connections, boost::bind (&MTC_Slave::update_mtc_time, this, _1, _2, _3)); - port->input()->mtc_qtr.connect (port_connections, boost::bind (&MTC_Slave::update_mtc_qtr, this, _1, _2, _3)); - port->input()->mtc_status.connect (port_connections, boost::bind (&MTC_Slave::update_mtc_status, this, _1)); + port->input()->mtc_time.connect_same_thread (port_connections, boost::bind (&MTC_Slave::update_mtc_time, this, _1, _2, _3)); + port->input()->mtc_qtr.connect_same_thread (port_connections, boost::bind (&MTC_Slave::update_mtc_qtr, this, _1, _2, _3)); + port->input()->mtc_status.connect_same_thread (port_connections, boost::bind (&MTC_Slave::update_mtc_status, this, _1)); } void diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 985cd6740a..e638a7a6b0 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -270,7 +270,7 @@ Playlist::init (bool hide) freeze_length = 0; _explicit_relayering = false; - Modified.connect (*this, boost::bind (&Playlist::mark_session_dirty, this)); + Modified.connect_same_thread (*this, boost::bind (&Playlist::mark_session_dirty, this)); } Playlist::~Playlist () @@ -605,7 +605,7 @@ Playlist::add_region_internal (boost::shared_ptr<Region> region, nframes_t posit } } - region->StateChanged.connect (region_state_changed_connections, boost::bind (&Playlist::region_changed_proxy, this, _1, boost::weak_ptr<Region> (region))); + region->StateChanged.connect_same_thread (region_state_changed_connections, boost::bind (&Playlist::region_changed_proxy, this, _1, boost::weak_ptr<Region> (region))); return true; } diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 731a7c04dd..d706421c39 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -109,7 +109,7 @@ Region::Region (boost::shared_ptr<Source> src, nframes_t start, nframes_t length _sources.push_back (src); _master_sources.push_back (src); - src->GoingAway.connect (*this, boost::bind (&Region::source_deleted, this, boost::weak_ptr<Source>(src))); + src->GoingAway.connect_same_thread (*this, boost::bind (&Region::source_deleted, this, boost::weak_ptr<Source>(src))); assert(_sources.size() > 0); _positional_lock_style = AudioTime; @@ -1586,14 +1586,14 @@ Region::use_sources (SourceList const & s) for (SourceList::const_iterator i = s.begin (); i != s.end(); ++i) { _sources.push_back (*i); - (*i)->GoingAway.connect (*this, boost::bind (&Region::source_deleted, this, boost::weak_ptr<Source>(*i))); + (*i)->GoingAway.connect_same_thread (*this, boost::bind (&Region::source_deleted, this, boost::weak_ptr<Source>(*i))); unique_srcs.insert (*i); } for (SourceList::const_iterator i = s.begin (); i != s.end(); ++i) { _master_sources.push_back (*i); if (unique_srcs.find (*i) == unique_srcs.end()) { - (*i)->GoingAway.connect (*this, boost::bind (&Region::source_deleted, this, boost::weak_ptr<Source>(*i))); + (*i)->GoingAway.connect_same_thread (*this, boost::bind (&Region::source_deleted, this, boost::weak_ptr<Source>(*i))); } } } diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index eeb8ae83c1..c652023e2c 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -93,7 +93,7 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type) /* now that we have _meter, its safe to connect to this */ - Metering::Meter.connect (*this, (boost::bind (&Route::meter, this))); + Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this))); } Route::Route (Session& sess, const XMLNode& node, DataType default_type) @@ -109,7 +109,7 @@ Route::Route (Session& sess, const XMLNode& node, DataType default_type) /* now that we have _meter, its safe to connect to this */ - Metering::Meter.connect (*this, (boost::bind (&Route::meter, this))); + Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this))); } void @@ -147,8 +147,8 @@ Route::init () _input.reset (new IO (_session, _name, IO::Input, _default_type)); _output.reset (new IO (_session, _name, IO::Output, _default_type)); - _input->changed.connect (*this, boost::bind (&Route::input_change_handler, this, _1, _2)); - _output->changed.connect (*this, boost::bind (&Route::output_change_handler, this, _1, _2)); + _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2)); + _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2)); /* add amp processor */ @@ -792,7 +792,7 @@ Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::ite // XXX: do we want to emit the signal here ? change call order. processor->activate (); } - processor->ActiveChanged.connect (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false)); + processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false)); _output->set_user_latency (0); } @@ -1047,7 +1047,7 @@ Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter return -1; } - (*i)->ActiveChanged.connect (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false)); + (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false)); } _output->set_user_latency (0); diff --git a/libs/ardour/route_group.cc b/libs/ardour/route_group.cc index 1da2eda678..2f946dd620 100644 --- a/libs/ardour/route_group.cc +++ b/libs/ardour/route_group.cc @@ -76,7 +76,7 @@ RouteGroup::add (boost::shared_ptr<Route> r) routes->push_back (r); r->join_route_group (this); - r->GoingAway.connect (*this, boost::bind (&RouteGroup::remove_when_going_away, this, boost::weak_ptr<Route> (r))); + r->GoingAway.connect_same_thread (*this, boost::bind (&RouteGroup::remove_when_going_away, this, boost::weak_ptr<Route> (r))); _session.set_dirty (); changed (); /* EMIT SIGNAL */ diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 8d707545fe..a062efee8d 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -190,8 +190,8 @@ Session::Session (AudioEngine &eng, _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty); - Config->ParameterChanged.connect (*this, boost::bind (&Session::config_changed, this, _1, false)); - config.ParameterChanged.connect (*this, boost::bind (&Session::config_changed, this, _1, true)); + Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false)); + config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true)); if (was_dirty) { DirtyChanged (); /* EMIT SIGNAL */ @@ -327,7 +327,7 @@ Session::Session (AudioEngine &eng, _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty); - Config->ParameterChanged.connect (*this, boost::bind (&Session::config_changed, this, _1, false)); + Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false)); } Session::~Session () @@ -523,7 +523,7 @@ Session::when_engine_running () /* every time we reconnect, recompute worst case output latencies */ - _engine.Running.connect (*this, boost::bind (&Session::set_worst_io_latencies, this)); + _engine.Running.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies, this)); if (synced_to_jack()) { _engine.transport_stop (); @@ -877,7 +877,7 @@ Session::diskstream_playlist_changed (boost::weak_ptr<Diskstream> wp) boost::shared_ptr<Playlist> playlist; if ((playlist = dstream->playlist()) != 0) { - playlist->LengthChanged.connect (*this, boost::bind (&Session::playlist_length_changed, this)); + playlist->LengthChanged.connect_same_thread (*this, boost::bind (&Session::playlist_length_changed, this)); } /* see comment in playlist_length_changed () */ @@ -1013,9 +1013,9 @@ Session::set_auto_punch_location (Location* location) punch_connections.drop_connections (); - location->start_changed.connect (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1)); - location->end_changed.connect (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1)); - location->changed.connect (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1)); + location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1)); + location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1)); + location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1)); location->set_auto_punch (true, this); @@ -1051,9 +1051,9 @@ Session::set_auto_loop_location (Location* location) loop_connections.drop_connections (); - location->start_changed.connect (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1)); - location->end_changed.connect (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1)); - location->changed.connect (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1)); + location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1)); + location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1)); + location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1)); location->set_auto_loop (true, this); @@ -1647,7 +1647,7 @@ Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_m route_group->add (track); } - track->DiskstreamChanged.connect (*this, boost::bind (&Session::resort_routes, this)); + track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this)); //track->set_remote_control_id (control_id); new_routes.push_back (track); @@ -1822,7 +1822,7 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod track->audio_diskstream()->non_realtime_input_change(); - track->DiskstreamChanged.connect (*this, boost::bind (&Session::resort_routes, this)); + track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this)); track->set_remote_control_id (control_id); ++control_id; @@ -2149,12 +2149,12 @@ Session::add_routes (RouteList& new_routes, bool save) boost::weak_ptr<Route> wpr (*x); - (*x)->listen_changed.connect (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr)); - (*x)->solo_changed.connect (*this, boost::bind (&Session::route_solo_changed, this, _1, wpr)); - (*x)->mute_changed.connect (*this, boost::bind (&Session::route_mute_changed, this, _1)); - (*x)->output()->changed.connect (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2)); - (*x)->processors_changed.connect (*this, boost::bind (&Session::route_processors_changed, this, _1)); - (*x)->route_group_changed.connect (*this, boost::bind (&Session::route_group_changed, this)); + (*x)->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr)); + (*x)->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, wpr)); + (*x)->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1)); + (*x)->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2)); + (*x)->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1)); + (*x)->route_group_changed.connect_same_thread (*this, boost::bind (&Session::route_group_changed, this)); if ((*x)->is_master()) { _master_out = (*x); @@ -2294,11 +2294,11 @@ Session::add_diskstream (boost::shared_ptr<Diskstream> dstream) /* writer goes out of scope, copies ds back to main */ } - dstream->PlaylistChanged.connect (*this, boost::bind (&Session::diskstream_playlist_changed, this, boost::weak_ptr<Diskstream> (dstream))); + dstream->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::diskstream_playlist_changed, this, boost::weak_ptr<Diskstream> (dstream))); /* this will connect to future changes, and check the current length */ diskstream_playlist_changed (boost::weak_ptr<Diskstream> (dstream)); - dstream->RecordEnableChanged.connect (*this, boost::bind (&Session::update_have_rec_enabled_diskstream, this)); + dstream->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_diskstream, this)); dstream->prepare (); @@ -2812,8 +2812,8 @@ Session::add_regions (vector<boost::shared_ptr<Region> >& new_regions) } } - region->StateChanged.connect (*this, boost::bind (&Session::region_changed, this, _1, boost::weak_ptr<Region>(region))); - region->GoingAway.connect (*this, boost::bind (&Session::remove_region, this, boost::weak_ptr<Region>(region))); + region->StateChanged.connect_same_thread (*this, boost::bind (&Session::region_changed, this, _1, boost::weak_ptr<Region>(region))); + region->GoingAway.connect_same_thread (*this, boost::bind (&Session::remove_region, this, boost::weak_ptr<Region>(region))); update_region_name_map (region); } @@ -3001,7 +3001,7 @@ Session::add_source (boost::shared_ptr<Source> source) } if (result.second) { - source->GoingAway.connect (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source))); + source->GoingAway.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source))); set_dirty(); } @@ -3392,7 +3392,7 @@ Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused) bool existing = playlists->add (playlist); if (!existing) { - playlist->GoingAway.connect (*this, boost::bind (&Session::remove_playlist, this, boost::weak_ptr<Playlist>(playlist))); + playlist->GoingAway.connect_same_thread (*this, boost::bind (&Session::remove_playlist, this, boost::weak_ptr<Playlist>(playlist))); } if (unused) { @@ -3566,7 +3566,7 @@ Session::graph_reordered () void Session::add_processor (Processor* processor) { - processor->GoingAway.connect (*this, boost::bind (&Session::remove_processor, this, processor)); + processor->GoingAway.connect_same_thread (*this, boost::bind (&Session::remove_processor, this, processor)); set_dirty(); } diff --git a/libs/ardour/session_export.cc b/libs/ardour/session_export.cc index 1bd0c2e7c7..840c752bad 100644 --- a/libs/ardour/session_export.cc +++ b/libs/ardour/session_export.cc @@ -91,8 +91,8 @@ Session::pre_export () _exporting = true; export_status->running = true; - export_status->Aborting.connect (*this, boost::bind (&Session::stop_audio_export, this)); - export_status->Finished.connect (*this, boost::bind (&Session::finalize_audio_export, this)); + export_status->Aborting.connect_same_thread (*this, boost::bind (&Session::stop_audio_export, this)); + export_status->Finished.connect_same_thread (*this, boost::bind (&Session::finalize_audio_export, this)); return 0; } @@ -150,7 +150,7 @@ Session::start_audio_export (nframes_t position, bool realtime) last_process_function = process_function; process_function = &Session::process_export; } else { - _engine.Freewheel.connect (export_freewheel_connection, boost::bind (&Session::process_export_fw, this, _1)); + _engine.Freewheel.connect_same_thread (export_freewheel_connection, boost::bind (&Session::process_export_fw, this, _1)); return _engine.freewheel (true); } diff --git a/libs/ardour/session_handle.cc b/libs/ardour/session_handle.cc index f1f6147960..1cd78c8aac 100644 --- a/libs/ardour/session_handle.cc +++ b/libs/ardour/session_handle.cc @@ -32,7 +32,7 @@ SessionHandlePtr::SessionHandlePtr (Session* s) : _session (s) { if (_session) { - _session->GoingAway.connect (_session_connections, boost::bind (&SessionHandlePtr::session_going_away, this)); + _session->GoingAway.connect_same_thread (_session_connections, boost::bind (&SessionHandlePtr::session_going_away, this)); } } @@ -47,7 +47,7 @@ SessionHandlePtr::set_session (Session* s) if (s) { _session = s; - _session->GoingAway.connect (_session_connections, boost::bind (&SessionHandlePtr::session_going_away, this)); + _session->GoingAway.connect_same_thread (_session_connections, boost::bind (&SessionHandlePtr::session_going_away, this)); } } @@ -63,7 +63,7 @@ SessionHandlePtr::session_going_away () SessionHandleRef::SessionHandleRef (Session& s) : _session (s) { - _session.GoingAway.connect (*this, boost::bind (&SessionHandleRef::session_going_away, this)); + _session.GoingAway.connect_same_thread (*this, boost::bind (&SessionHandleRef::session_going_away, this)); } void diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index bd06fe78ee..d8859e07c0 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -208,26 +208,26 @@ Session::set_mmc_port (string port_tag) mmc->set_send_device_id (old_send_device_id); } - mmc->Play.connect (*this, boost::bind (&Session::mmc_deferred_play, this, _1)); - mmc->DeferredPlay.connect (*this, boost::bind (&Session::mmc_deferred_play, this, _1)); - mmc->Stop.connect (*this, boost::bind (&Session::mmc_stop, this, _1)); - mmc->FastForward.connect (*this, boost::bind (&Session::mmc_fast_forward, this, _1)); - mmc->Rewind.connect (*this, boost::bind (&Session::mmc_rewind, this, _1)); - mmc->Pause.connect (*this, boost::bind (&Session::mmc_pause, this, _1)); - mmc->RecordPause.connect (*this, boost::bind (&Session::mmc_record_pause, this, _1)); - mmc->RecordStrobe.connect (*this, boost::bind (&Session::mmc_record_strobe, this, _1)); - mmc->RecordExit.connect (*this, boost::bind (&Session::mmc_record_exit, this, _1)); - mmc->Locate.connect (*this, boost::bind (&Session::mmc_locate, this, _1, _2)); - mmc->Step.connect (*this, boost::bind (&Session::mmc_step, this, _1, _2)); - mmc->Shuttle.connect (*this, boost::bind (&Session::mmc_shuttle, this, _1, _2, _3)); - mmc->TrackRecordStatusChange.connect (*this, boost::bind (&Session::mmc_record_enable, this, _1, _2, _3)); + mmc->Play.connect_same_thread (*this, boost::bind (&Session::mmc_deferred_play, this, _1)); + mmc->DeferredPlay.connect_same_thread (*this, boost::bind (&Session::mmc_deferred_play, this, _1)); + mmc->Stop.connect_same_thread (*this, boost::bind (&Session::mmc_stop, this, _1)); + mmc->FastForward.connect_same_thread (*this, boost::bind (&Session::mmc_fast_forward, this, _1)); + mmc->Rewind.connect_same_thread (*this, boost::bind (&Session::mmc_rewind, this, _1)); + mmc->Pause.connect_same_thread (*this, boost::bind (&Session::mmc_pause, this, _1)); + mmc->RecordPause.connect_same_thread (*this, boost::bind (&Session::mmc_record_pause, this, _1)); + mmc->RecordStrobe.connect_same_thread (*this, boost::bind (&Session::mmc_record_strobe, this, _1)); + mmc->RecordExit.connect_same_thread (*this, boost::bind (&Session::mmc_record_exit, this, _1)); + mmc->Locate.connect_same_thread (*this, boost::bind (&Session::mmc_locate, this, _1, _2)); + mmc->Step.connect_same_thread (*this, boost::bind (&Session::mmc_step, this, _1, _2)); + mmc->Shuttle.connect_same_thread (*this, boost::bind (&Session::mmc_shuttle, this, _1, _2, _3)); + mmc->TrackRecordStatusChange.connect_same_thread (*this, boost::bind (&Session::mmc_record_enable, this, _1, _2, _3)); /* also handle MIDI SPP because its so common */ - _mmc_port->input()->start.connect (*this, boost::bind (&Session::spp_start, this, _1, _2)); - _mmc_port->input()->contineu.connect (*this, boost::bind (&Session::spp_continue, this, _1, _2)); - _mmc_port->input()->stop.connect (*this, boost::bind (&Session::spp_stop, this, _1, _2)); + _mmc_port->input()->start.connect_same_thread (*this, boost::bind (&Session::spp_start, this, _1, _2)); + _mmc_port->input()->contineu.connect_same_thread (*this, boost::bind (&Session::spp_continue, this, _1, _2)); + _mmc_port->input()->stop.connect_same_thread (*this, boost::bind (&Session::spp_stop, this, _1, _2)); Config->set_mmc_port_name (port_tag); diff --git a/libs/ardour/session_playlists.cc b/libs/ardour/session_playlists.cc index 0d32ea75d7..238bd72404 100644 --- a/libs/ardour/session_playlists.cc +++ b/libs/ardour/session_playlists.cc @@ -74,7 +74,7 @@ SessionPlaylists::add (boost::shared_ptr<Playlist> playlist) if (!existing) { playlists.insert (playlists.begin(), playlist); - playlist->InUse.connect (*this, boost::bind (&SessionPlaylists::track, this, _1, boost::weak_ptr<Playlist>(playlist))); + playlist->InUse.connect_same_thread (*this, boost::bind (&SessionPlaylists::track, this, _1, boost::weak_ptr<Playlist>(playlist))); } return existing; diff --git a/libs/ardour/session_rtevents.cc b/libs/ardour/session_rtevents.cc index 7bb27db808..5def97941f 100644 --- a/libs/ardour/session_rtevents.cc +++ b/libs/ardour/session_rtevents.cc @@ -39,7 +39,7 @@ Session::get_rt_event (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::R SessionEvent* ev = new SessionEvent (SessionEvent::RealTimeOperation, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0); ev->rt_slot = boost::bind (method, this, rl, yn, group_override); ev->rt_return = after; - ev->ui = UICallback::get_ui_for_thread (); + ev->event_loop = EventLoop::get_event_loop_for_thread (); return ev; } @@ -162,8 +162,8 @@ Session::process_rtop (SessionEvent* ev) { ev->rt_slot (); - if (ev->ui) { - ev->ui->call_slot (boost::bind (ev->rt_return, ev)); + if (ev->event_loop) { + ev->event_loop->call_slot (boost::bind (ev->rt_return, ev)); } else { warning << string_compose ("programming error: %1", X_("Session RT event queued from thread without a UI - cleanup in RT thread!")) << endmsg; ev->rt_return (ev); diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index bcd074a516..2248663478 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -164,7 +164,7 @@ Session::first_stage_init (string fullpath, string snapshot_name) _base_frame_rate = _current_frame_rate; _tempo_map = new TempoMap (_current_frame_rate); - _tempo_map->StateChanged.connect (*this, boost::bind (&Session::tempo_map_changed, this, _1)); + _tempo_map->StateChanged.connect_same_thread (*this, boost::bind (&Session::tempo_map_changed, this, _1)); _non_soloed_outs_muted = false; @@ -266,18 +266,18 @@ Session::first_stage_init (string fullpath, string snapshot_name) delta_accumulator_cnt = 0; _slave_state = Stopped; - _engine.GraphReordered.connect (*this, boost::bind (&Session::graph_reordered, this)); + _engine.GraphReordered.connect_same_thread (*this, boost::bind (&Session::graph_reordered, this)); /* These are all static "per-class" signals */ - RegionFactory::CheckNewRegion.connect (*this, boost::bind (&Session::add_region, this, _1)); - SourceFactory::SourceCreated.connect (*this, boost::bind (&Session::add_source, this, _1)); - PlaylistFactory::PlaylistCreated.connect (*this, boost::bind (&Session::add_playlist, this, _1, _2)); - Processor::ProcessorCreated.connect (*this, boost::bind (&Session::add_processor, this, _1)); - NamedSelection::NamedSelectionCreated.connect (*this, boost::bind (&Session::add_named_selection, this, _1)); - AutomationList::AutomationListCreated.connect (*this, boost::bind (&Session::add_automation_list, this, _1)); - Controllable::Destroyed.connect (*this, boost::bind (&Session::remove_controllable, this, _1)); - IO::PortCountChanged.connect (*this, boost::bind (&Session::ensure_buffers, this, _1)); + RegionFactory::CheckNewRegion.connect_same_thread (*this, boost::bind (&Session::add_region, this, _1)); + SourceFactory::SourceCreated.connect_same_thread (*this, boost::bind (&Session::add_source, this, _1)); + PlaylistFactory::PlaylistCreated.connect_same_thread (*this, boost::bind (&Session::add_playlist, this, _1, _2)); + Processor::ProcessorCreated.connect_same_thread (*this, boost::bind (&Session::add_processor, this, _1)); + NamedSelection::NamedSelectionCreated.connect_same_thread (*this, boost::bind (&Session::add_named_selection, this, _1)); + AutomationList::AutomationListCreated.connect_same_thread (*this, boost::bind (&Session::add_automation_list, this, _1)); + Controllable::Destroyed.connect_same_thread (*this, boost::bind (&Session::remove_controllable, this, _1)); + IO::PortCountChanged.connect_same_thread (*this, boost::bind (&Session::ensure_buffers, this, _1)); /* stop IO objects from doing stuff until we're ready for them */ @@ -329,15 +329,15 @@ Session::second_stage_init (bool new_session) _state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave|Loading); - _locations.changed.connect (*this, boost::bind (&Session::locations_changed, this)); - _locations.added.connect (*this, boost::bind (&Session::locations_added, this, _1)); + _locations.changed.connect_same_thread (*this, boost::bind (&Session::locations_changed, this)); + _locations.added.connect_same_thread (*this, boost::bind (&Session::locations_added, this, _1)); setup_click_sounds (0); setup_midi_control (); /* Pay attention ... */ - _engine.Halted.connect (*this, boost::bind (&Session::engine_halted, this)); - _engine.Xrun.connect (*this, boost::bind (&Session::xrun_recovery, this)); + _engine.Halted.connect_same_thread (*this, boost::bind (&Session::engine_halted, this)); + _engine.Xrun.connect_same_thread (*this, boost::bind (&Session::xrun_recovery, this)); try { when_engine_running(); diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc index 6805e5f6dd..185cb15e79 100644 --- a/libs/ardour/sndfilesource.cc +++ b/libs/ardour/sndfilesource.cc @@ -192,7 +192,7 @@ SndFileSource::init_sndfile () _timeline_position = header_position_offset; } - AudioFileSource::HeaderPositionOffsetChanged.connect (header_position_connection, boost::bind (&SndFileSource::handle_header_position_change, this)); + AudioFileSource::HeaderPositionOffsetChanged.connect_same_thread (header_position_connection, boost::bind (&SndFileSource::handle_header_position_change, this)); } int diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc index f35f84e889..2ef5abe5d5 100644 --- a/libs/ardour/ticker.cc +++ b/libs/ardour/ticker.cc @@ -34,7 +34,7 @@ void Ticker::set_session (Session* s) SessionHandlePtr::set_session (s); if (_session) { - _session->tick.connect (_session_connections, boost::bind (&Ticker::tick, this, _1, _2, _3)); + _session->tick.connect_same_thread (_session_connections, boost::bind (&Ticker::tick, this, _1, _2, _3)); } } @@ -43,10 +43,10 @@ void MidiClockTicker::set_session (Session* s) Ticker::set_session (s); if (_session) { - _session->MIDIClock_PortChanged.connect (_session_connections, boost::bind (&MidiClockTicker::update_midi_clock_port, this)); - _session->TransportStateChange.connect (_session_connections, boost::bind (&MidiClockTicker::transport_state_changed, this)); - _session->PositionChanged.connect (_session_connections, boost::bind (&MidiClockTicker::position_changed, this, _1)); - _session->TransportLooped.connect (_session_connections, boost::bind (&MidiClockTicker::transport_looped, this)); + _session->MIDIClock_PortChanged.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::update_midi_clock_port, this)); + _session->TransportStateChange.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::transport_state_changed, this)); + _session->PositionChanged.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::position_changed, this, _1)); + _session->TransportLooped.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::transport_looped, this)); update_midi_clock_port(); } } diff --git a/libs/gtkmm2ext/binding_proxy.cc b/libs/gtkmm2ext/binding_proxy.cc index 08d215036d..f12c64cf68 100644 --- a/libs/gtkmm2ext/binding_proxy.cc +++ b/libs/gtkmm2ext/binding_proxy.cc @@ -88,7 +88,7 @@ BindingProxy::button_press_handler (GdkEventButton *ev) } prompter->set_text (prompt); prompter->touch (); // shows popup - controllable->LearningFinished.connect (learning_connection, boost::bind (&BindingProxy::learning_finished, this)); + controllable->LearningFinished.connect_same_thread (learning_connection, boost::bind (&BindingProxy::learning_finished, this)); } return true; } diff --git a/libs/gtkmm2ext/gtk_ui.cc b/libs/gtkmm2ext/gtk_ui.cc index 3d86c6d103..38512d70f5 100644 --- a/libs/gtkmm2ext/gtk_ui.cc +++ b/libs/gtkmm2ext/gtk_ui.cc @@ -85,7 +85,7 @@ UI::UI (string namestr, int *argc, char ***argv) as for previous line. */ - set_ui_for_thread (this); + set_event_loop_for_thread (this); /* attach our request source to the default main context */ diff --git a/libs/midi++2/channel.cc b/libs/midi++2/channel.cc index bf71b0579c..2760e8ae51 100644 --- a/libs/midi++2/channel.cc +++ b/libs/midi++2/channel.cc @@ -35,30 +35,29 @@ Channel::Channel (byte channelnum, Port &p) : _port (p) void Channel::connect_input_signals () { - _port.input()->channel_pressure[_channel_number].connect (*this, boost::bind (&Channel::process_chanpress, this, _1, _2)); - _port.input()->channel_note_on[_channel_number].connect (*this, boost::bind (&Channel::process_note_on, this, _1, _2)); - _port.input()->channel_note_off[_channel_number].connect (*this, boost::bind (&Channel::process_note_off, this, _1, _2)); - _port.input()->channel_poly_pressure[_channel_number].connect (*this, boost::bind (&Channel::process_polypress, this, _1, _2)); - _port.input()->channel_program_change[_channel_number].connect (*this, boost::bind (&Channel::process_program_change, this, _1, _2)); - _port.input()->channel_controller[_channel_number].connect (*this, boost::bind (&Channel::process_controller, this, _1, _2)); - _port.input()->channel_pitchbend[_channel_number].connect (*this, boost::bind (&Channel::process_pitchbend, this, _1, _2)); - - _port.input()->reset.connect (*this, boost::bind (&Channel::process_reset, this, _1)); + _port.input()->channel_pressure[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_chanpress, this, _1, _2)); + _port.input()->channel_note_on[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_note_on, this, _1, _2)); + _port.input()->channel_note_off[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_note_off, this, _1, _2)); + _port.input()->channel_poly_pressure[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_polypress, this, _1, _2)); + _port.input()->channel_program_change[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_program_change, this, _1, _2)); + _port.input()->channel_controller[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_controller, this, _1, _2)); + _port.input()->channel_pitchbend[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_pitchbend, this, _1, _2)); + + _port.input()->reset.connect_same_thread (*this, boost::bind (&Channel::process_reset, this, _1)); } void Channel::connect_output_signals () - { - _port.output()->channel_pressure[_channel_number].connect (*this, boost::bind (&Channel::process_chanpress, this, _1, _2)); - _port.output()->channel_note_on[_channel_number].connect (*this, boost::bind (&Channel::process_note_on, this, _1, _2)); - _port.output()->channel_note_off[_channel_number].connect (*this, boost::bind (&Channel::process_note_off, this, _1, _2)); - _port.output()->channel_poly_pressure[_channel_number].connect (*this, boost::bind (&Channel::process_polypress, this, _1, _2)); - _port.output()->channel_program_change[_channel_number].connect (*this, boost::bind (&Channel::process_program_change, this, _1, _2)); - _port.output()->channel_controller[_channel_number].connect (*this, boost::bind (&Channel::process_controller, this, _1, _2)); - _port.output()->channel_pitchbend[_channel_number].connect (*this, boost::bind (&Channel::process_pitchbend, this, _1, _2)); - - _port.output()->reset.connect (*this, boost::bind (&Channel::process_reset, this, _1)); + _port.output()->channel_pressure[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_chanpress, this, _1, _2)); + _port.output()->channel_note_on[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_note_on, this, _1, _2)); + _port.output()->channel_note_off[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_note_off, this, _1, _2)); + _port.output()->channel_poly_pressure[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_polypress, this, _1, _2)); + _port.output()->channel_program_change[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_program_change, this, _1, _2)); + _port.output()->channel_controller[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_controller, this, _1, _2)); + _port.output()->channel_pitchbend[_channel_number].connect_same_thread (*this, boost::bind (&Channel::process_pitchbend, this, _1, _2)); + + _port.output()->reset.connect_same_thread (*this, boost::bind (&Channel::process_reset, this, _1)); } void diff --git a/libs/midi++2/midi++/fd_midiport.h b/libs/midi++2/midi++/fd_midiport.h index 986ff5f0e0..673037cc5d 100644 --- a/libs/midi++2/midi++/fd_midiport.h +++ b/libs/midi++2/midi++/fd_midiport.h @@ -67,13 +67,11 @@ class FD_MidiPort : public Port bytes_written += nwritten; if (output_parser) { - output_parser->raw_preparse - (*output_parser, msg, nwritten); + output_parser->raw_preparse (*output_parser, msg, nwritten); for (int i = 0; i < nwritten; i++) { output_parser->scanner (msg[i]); } - output_parser->raw_postparse - (*output_parser, msg, nwritten); + output_parser->raw_postparse (*output_parser, msg, nwritten); } } return nwritten; diff --git a/libs/midi++2/mmc.cc b/libs/midi++2/mmc.cc index eb1c6cb5b0..6030230108 100644 --- a/libs/midi++2/mmc.cc +++ b/libs/midi++2/mmc.cc @@ -206,7 +206,7 @@ MachineControl::MachineControl (Port &p, float /*version*/, _send_device_id = 0x7f; if ((parser = _port.input()) != 0) { - parser->mmc.connect (mmc_connection, boost::bind (&MachineControl::process_mmc_message, this, _1, _2, _3)); + parser->mmc.connect_same_thread (mmc_connection, boost::bind (&MachineControl::process_mmc_message, this, _1, _2, _3)); } else { warning << "MMC connected to a non-input port: useless!" << endmsg; diff --git a/libs/midi++2/parser.cc b/libs/midi++2/parser.cc index 2efa77ae0b..af9cfafaca 100644 --- a/libs/midi++2/parser.cc +++ b/libs/midi++2/parser.cc @@ -316,7 +316,7 @@ Parser::trace (bool onoff, ostream *o, const string &prefix) cerr << "enabling tracing for port " << _port.name() << endl; trace_stream = o; trace_prefix = prefix; - any.connect (trace_connection, boost::bind (&Parser::trace_event, this, _1, _2, _3)); + any.connect_same_thread (trace_connection, boost::bind (&Parser::trace_event, this, _1, _2, _3)); } else { trace_prefix = ""; trace_stream = 0; diff --git a/libs/pbd/base_ui.cc b/libs/pbd/base_ui.cc index ea7e469c74..5e856d1ca0 100644 --- a/libs/pbd/base_ui.cc +++ b/libs/pbd/base_ui.cc @@ -70,7 +70,7 @@ BaseUI::new_request_type () void BaseUI::main_thread () { - set_ui_for_thread (this); + set_event_loop_for_thread (this); thread_init (); _main_loop->run (); } diff --git a/libs/pbd/controllable.cc b/libs/pbd/controllable.cc index dd0dfd4445..d751c3c80b 100644 --- a/libs/pbd/controllable.cc +++ b/libs/pbd/controllable.cc @@ -62,7 +62,7 @@ Controllable::add (Controllable& ctl) /* Controllable::remove() is static - no need to manage this connection */ - ctl.GoingAway.connect (registry_connections, boost::bind (&Controllable::remove, ref (ctl))); + ctl.GoingAway.connect_same_thread (registry_connections, boost::bind (&Controllable::remove, ref (ctl))); } void diff --git a/libs/pbd/event_loop.cc b/libs/pbd/event_loop.cc new file mode 100644 index 0000000000..3bc4abcbdf --- /dev/null +++ b/libs/pbd/event_loop.cc @@ -0,0 +1,19 @@ +#include "pbd/event_loop.h" + +using namespace PBD; + +Glib::StaticPrivate<EventLoop> EventLoop::thread_event_loop; + +static void do_not_delete_the_loop_pointer (void*) { } + +EventLoop* +EventLoop::get_event_loop_for_thread() { + return thread_event_loop.get (); +} + +void +EventLoop::set_event_loop_for_thread (EventLoop* loop) +{ + thread_event_loop.set (loop, do_not_delete_the_loop_pointer); +} + diff --git a/libs/pbd/pbd/base_ui.h b/libs/pbd/pbd/base_ui.h index 2bfaa11be0..9e88be60f2 100644 --- a/libs/pbd/pbd/base_ui.h +++ b/libs/pbd/pbd/base_ui.h @@ -30,9 +30,9 @@ #include <glibmm/main.h> #include "pbd/crossthread.h" -#include "pbd/ui_callback.h" +#include "pbd/event_loop.h" -class BaseUI : virtual public sigc::trackable, public PBD::UICallback +class BaseUI : virtual public sigc::trackable, public PBD::EventLoop { public: BaseUI (const std::string& name); diff --git a/libs/pbd/pbd/ui_callback.h b/libs/pbd/pbd/event_loop.h index 8574de0dec..be98fcd852 100644 --- a/libs/pbd/pbd/ui_callback.h +++ b/libs/pbd/pbd/event_loop.h @@ -17,8 +17,8 @@ */ -#ifndef __pbd_ui_callback_h__ -#define __pbd_ui_callback_h__ +#ifndef __pbd_event_loop_h__ +#define __pbd_event_loop_h__ #include <boost/function.hpp> #include <boost/bind.hpp> /* we don't need this here, but anything calling call_slot() probably will, so this is convenient */ @@ -27,22 +27,22 @@ namespace PBD { -class UICallback +class EventLoop { public: - UICallback() {} - virtual ~UICallback() {} + EventLoop() {} + virtual ~EventLoop() {} virtual void call_slot (const boost::function<void()>&) = 0; - static UICallback* get_ui_for_thread(); - static void set_ui_for_thread (UICallback* ui); + static EventLoop* get_event_loop_for_thread(); + static void set_event_loop_for_thread (EventLoop* ui); private: - static Glib::StaticPrivate<UICallback> thread_ui; + static Glib::StaticPrivate<EventLoop> thread_event_loop; }; } -#endif /* __pbd_ui_callback_h__ */ +#endif /* __pbd_event_loop_h__ */ diff --git a/libs/pbd/pbd/memento_command.h b/libs/pbd/pbd/memento_command.h index b87f784334..a08d3bb717 100644 --- a/libs/pbd/pbd/memento_command.h +++ b/libs/pbd/pbd/memento_command.h @@ -42,7 +42,7 @@ public: : obj(a_object), before(a_before), after(a_after) { /* if the object dies, make sure that we die and that everyone knows about it */ - obj.GoingAway.connect (obj_death_connection, boost::bind (&MementoCommand::object_died, this)); + obj.GoingAway.connect_same_thread (obj_death_connection, boost::bind (&MementoCommand::object_died, this)); } ~MementoCommand () { diff --git a/libs/pbd/pbd/shiva.h b/libs/pbd/pbd/shiva.h deleted file mode 100644 index 90adad6250..0000000000 --- a/libs/pbd/pbd/shiva.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - Copyright (C) 2000-2007 Paul Davis - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#ifndef __pbd_shiva_h__ -#define __pbd_shiva_h__ - -#include <sigc++/sigc++.h> - -namespace PBD { - -/* named after the Hindu god Shiva, The Destroyer */ - -template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed> -class Shiva : public sigc::trackable -{ - public: - Shiva (ObjectWithGoingAway& emitter, ObjectToBeDestroyed& receiver) { - - /* if the emitter goes away, destroy the receiver */ - - _connection = emitter.GoingAway.connect - (sigc::bind (sigc::mem_fun - (*this, &Shiva<ObjectWithGoingAway,ObjectToBeDestroyed>::destroy), - &receiver)); - } - - ~Shiva() { - forget (); - } - - private: - sigc::connection _connection; - - void destroy (ObjectToBeDestroyed* obj) { - delete obj; - forget (); - } - - void forget () { - _connection.disconnect (); - } - -}; - -template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed> -class ProxyShiva : public sigc::trackable -{ - public: - ProxyShiva (ObjectWithGoingAway& emitter, ObjectToBeDestroyed& receiver, void (*callback)(ObjectToBeDestroyed*, ObjectWithGoingAway*)) { - - /* if the emitter goes away, destroy the receiver */ - - _callback = callback; - _callback_argument = &emitter; - - _connection = emitter.GoingAway.connect - (sigc::bind (sigc::mem_fun - (*this, &ProxyShiva<ObjectWithGoingAway,ObjectToBeDestroyed>::destroy), - &receiver)); - } - - ~ProxyShiva () { - forget (); - } - - private: - sigc::connection _connection; - void (*_callback) (ObjectToBeDestroyed*, ObjectWithGoingAway*); - ObjectWithGoingAway* _callback_argument; - - void destroy (ObjectToBeDestroyed* obj) { - /* callback must destroy obj if appropriate, not done here */ - _callback (obj, _callback_argument); - forget (); - } - - void forget () { - _connection.disconnect (); - } -}; - -template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed> -class PairedShiva : public sigc::trackable -{ - public: - PairedShiva (ObjectWithGoingAway& emitter, ObjectToBeDestroyed& receiver) { - - /* if the emitter goes away, destroy the receiver */ - - _connection1 = emitter.GoingAway.connect - (sigc::bind (sigc::mem_fun - (*this, &PairedShiva<ObjectWithGoingAway,ObjectToBeDestroyed>::destroy), - &receiver)); - - /* if the receiver goes away, forget all this nonsense */ - - _connection2 = receiver.GoingAway.connect - (sigc::mem_fun (*this, &PairedShiva<ObjectWithGoingAway,ObjectToBeDestroyed>::forget)); - } - - ~PairedShiva() { - forget (); - } - - private: - sigc::connection _connection1; - sigc::connection _connection2; - - void destroy (ObjectToBeDestroyed* obj) { - delete obj; - forget (); - } - - void forget () { - _connection1.disconnect (); - _connection2.disconnect (); - } - -}; - -} - -#endif /* __pbd_shiva_h__ */ diff --git a/libs/pbd/pbd/signals.h b/libs/pbd/pbd/signals.h index 47e8d143bc..0b44ee8051 100644 --- a/libs/pbd/pbd/signals.h +++ b/libs/pbd/pbd/signals.h @@ -22,8 +22,13 @@ #include <list> #include <glibmm/thread.h> + #include <boost/signals2.hpp> #include <boost/noncopyable.hpp> +#include <boost/bind.hpp> +#include <boost/bind/protect.hpp> + +#include "pbd/event_loop.h" namespace PBD { @@ -40,10 +45,6 @@ class ScopedConnectionList : public boost::noncopyable void add_connection (const UnscopedConnection& c); void drop_connections (); - template<typename S> void scoped_connect (S& sig, const typename S::slot_function_type& sf) { - add_connection (sig.connect (sf)); - } - private: /* this class is not copyable */ ScopedConnectionList(const ScopedConnectionList&); @@ -76,14 +77,26 @@ public: Signal0 () {} typedef boost::signals2::signal<R()> SignalType; - void connect (ScopedConnectionList& clist, + void connect_same_thread (Connection& c, + const typename SignalType::slot_function_type& slot) { + c = _signal.connect (slot); + } + + void connect_same_thread (ScopedConnectionList& clist, const typename SignalType::slot_function_type& slot) { clist.add_connection (_signal.connect (slot)); } + + void connect (ScopedConnectionList& clist, + const typename SignalType::slot_function_type& slot, + PBD::EventLoop* event_loop) { + clist.add_connection (_signal.connect (boost::bind (&EventLoop::call_slot, event_loop, slot))); + } void connect (Connection& c, - const typename SignalType::slot_function_type& slot) { - c = _signal.connect (slot); + const typename SignalType::slot_function_type& slot, + PBD::EventLoop* event_loop) { + c = _signal.connect (boost::bind (&EventLoop::call_slot, event_loop, slot)); } typename SignalType::result_type operator()() { @@ -100,15 +113,32 @@ public: Signal1 () {} typedef boost::signals2::signal<R(A)> SignalType; - void connect (ScopedConnectionList& clist, + void connect_same_thread (ScopedConnectionList& clist, const typename SignalType::slot_function_type& slot) { clist.add_connection (_signal.connect (slot)); } - void connect (Connection& c, - const typename SignalType::slot_function_type& slot) { + void connect_same_thread (Connection& c, + const typename SignalType::slot_function_type& slot) { c = _signal.connect (slot); } + + static void compositor (typename boost::function<void(A)> f, EventLoop* event_loop, A arg) { + event_loop->call_slot (boost::bind (f, arg)); + } + + void connect (ScopedConnectionList& clist, + const typename SignalType::slot_function_type& slot, + PBD::EventLoop* event_loop) { + clist.add_connection (_signal.connect (boost::bind (&compositor, slot, event_loop, _1))); + } + + void connect (Connection& c, + const typename SignalType::slot_function_type& slot, + PBD::EventLoop* event_loop) { + c = _signal.connect (boost::bind (&compositor, slot, event_loop, _1)); + + } typename SignalType::result_type operator()(A arg1) { return _signal (arg1); @@ -124,16 +154,32 @@ public: Signal2 () {} typedef boost::signals2::signal<R(A1, A2)> SignalType; - void connect (ScopedConnectionList& clist, + void connect_same_thread (ScopedConnectionList& clist, const typename SignalType::slot_function_type& slot) { clist.add_connection (_signal.connect (slot)); } - - void connect (Connection& c, - const typename SignalType::slot_function_type& slot) { + + void connect_same_thread (Connection& c, + const typename SignalType::slot_function_type& slot) { c = _signal.connect (slot); } - + + static void compositor (typename boost::function<void(A1,A2)> f, PBD::EventLoop* event_loop, A1 arg1, A2 arg2) { + event_loop->call_slot (boost::bind (f, arg1, arg2)); + } + + void connect (ScopedConnectionList& clist, + const typename SignalType::slot_function_type& slot, + PBD::EventLoop* event_loop) { + clist.add_connection (_signal.connect (boost::bind (&compositor, slot, event_loop, _1, _2))); + } + + void connect (Connection& c, + const typename SignalType::slot_function_type& slot, + PBD::EventLoop* event_loop) { + c = _signal.connect (boost::bind (&compositor, slot, event_loop, _1, _2)); + } + typename SignalType::result_type operator()(A1 arg1, A2 arg2) { return _signal (arg1, arg2); } @@ -148,14 +194,30 @@ public: Signal3 () {} typedef boost::signals2::signal<R(A1,A2,A3)> SignalType; - void connect (ScopedConnectionList& clist, + void connect_same_thread (ScopedConnectionList& clist, const typename SignalType::slot_function_type& slot) { clist.add_connection (_signal.connect (slot)); } + + void connect_same_thread (Connection& c, + const typename SignalType::slot_function_type& slot) { + c = _signal.connect (slot); + } + + static void compositor (typename boost::function<void(A1,A2,A3)> f, PBD::EventLoop* event_loop, A1 arg1, A2 arg2, A3 arg3) { + event_loop->call_slot (boost::bind (f, arg1, arg2, arg3)); + } + + void connect (ScopedConnectionList& clist, + const typename SignalType::slot_function_type& slot, + PBD::EventLoop* event_loop) { + clist.add_connection (_signal.connect (boost::bind (&compositor, slot, event_loop, _1, _2, _3))); + } void connect (Connection& c, - const typename SignalType::slot_function_type& slot) { - c = _signal.connect (slot); + const typename SignalType::slot_function_type& slot, + PBD::EventLoop* event_loop) { + c = _signal.connect (_signal.connect (boost::bind (&compositor, slot, event_loop, _1, _2, _3))); } typename SignalType::result_type operator()(A1 arg1, A2 arg2, A3 arg3) { diff --git a/libs/pbd/ui_callback.cc b/libs/pbd/ui_callback.cc deleted file mode 100644 index 9a8feb3d2c..0000000000 --- a/libs/pbd/ui_callback.cc +++ /dev/null @@ -1,19 +0,0 @@ -#include "pbd/ui_callback.h" - -using namespace PBD; - -Glib::StaticPrivate<UICallback> UICallback::thread_ui; - -static void do_not_delete_the_ui_pointer (void*) { } - -UICallback* -UICallback::get_ui_for_thread() { - return thread_ui.get (); -} - -void -UICallback::set_ui_for_thread (UICallback* ui) -{ - thread_ui.set (ui, do_not_delete_the_ui_pointer); -} - diff --git a/libs/pbd/undo.cc b/libs/pbd/undo.cc index 1a2574ae28..81e31f3a88 100644 --- a/libs/pbd/undo.cc +++ b/libs/pbd/undo.cc @@ -83,7 +83,7 @@ UndoTransaction::add_command (Command *const action) so there is no need to manage this connection. */ - action->GoingAway.connect (*this, boost::bind (&command_death, this, action)); + action->GoingAway.connect_same_thread (*this, boost::bind (&command_death, this, action)); actions.push_back (action); } @@ -186,7 +186,7 @@ UndoHistory::add (UndoTransaction* const ut) { uint32_t current_depth = UndoList.size(); - ut->GoingAway.connect (*this, boost::bind (&UndoHistory::remove, this, ut)); + ut->GoingAway.connect_same_thread (*this, boost::bind (&UndoHistory::remove, this, ut)); /* if the current undo history is larger than or equal to the currently requested depth, then pop off at least 1 element to make space diff --git a/libs/pbd/wscript b/libs/pbd/wscript index d7e456ada7..b25d8059ce 100644 --- a/libs/pbd/wscript +++ b/libs/pbd/wscript @@ -59,6 +59,7 @@ def build(bld): controllable.cc crossthread.cc enumwriter.cc + event_loop.cc dmalloc.cc error.cc filesystem.cc @@ -82,7 +83,6 @@ def build(bld): strsplit.cc textreceiver.cc transmitter.cc - ui_callback.cc undo.cc uuid.cc version.cc diff --git a/libs/surfaces/control_protocol/control_protocol.cc b/libs/surfaces/control_protocol/control_protocol.cc index d7f9d52efd..ff6de6b274 100644 --- a/libs/surfaces/control_protocol/control_protocol.cc +++ b/libs/surfaces/control_protocol/control_protocol.cc @@ -18,6 +18,8 @@ */ +#include "pbd/error.h" + #include "ardour/session.h" #include "ardour/route.h" #include "ardour/audio_track.h" @@ -27,19 +29,30 @@ using namespace ARDOUR; using namespace std; +using namespace PBD; -PBD::Signal0<void> ControlProtocol::ZoomToSession; -PBD::Signal0<void> ControlProtocol::ZoomOut; -PBD::Signal0<void> ControlProtocol::ZoomIn; -PBD::Signal0<void> ControlProtocol::Enter; -PBD::Signal1<void,float> ControlProtocol::ScrollTimeline; +Signal0<void> ControlProtocol::ZoomToSession; +Signal0<void> ControlProtocol::ZoomOut; +Signal0<void> ControlProtocol::ZoomIn; +Signal0<void> ControlProtocol::Enter; +Signal1<void,float> ControlProtocol::ScrollTimeline; -ControlProtocol::ControlProtocol (Session& s, string str) +ControlProtocol::ControlProtocol (Session& s, string str, EventLoop* evloop) : BasicUI (s), _name (str) { + if (evloop) { + _own_event_loop = false; + _event_loop = evloop; + } else { + _own_event_loop = true; + fatal << "programming error: cannot create control protocols without an existing event loop (yet)" << endmsg; + /*NOTREACHED*/ + } + _active = false; - session->RouteAdded.connect (*this, boost::bind (&ControlProtocol::add_strip, this, _1)); + + session->RouteAdded.connect (*this, boost::protect (boost::bind (&ControlProtocol::add_strip, this, _1)), _event_loop); } ControlProtocol::~ControlProtocol () @@ -47,7 +60,7 @@ ControlProtocol::~ControlProtocol () } void -ControlProtocol::add_strip (std::list<boost::shared_ptr<ARDOUR::Route> >) +ControlProtocol::add_strip (ARDOUR::RouteList&) { route_list_changed(); } diff --git a/libs/surfaces/control_protocol/control_protocol/control_protocol.h b/libs/surfaces/control_protocol/control_protocol/control_protocol.h index c80ba9b4b6..b3d44a15aa 100644 --- a/libs/surfaces/control_protocol/control_protocol/control_protocol.h +++ b/libs/surfaces/control_protocol/control_protocol/control_protocol.h @@ -36,7 +36,7 @@ class Session; class ControlProtocol : virtual public sigc::trackable, public PBD::Stateful, public PBD::ScopedConnectionList, public BasicUI { public: - ControlProtocol (Session&, std::string name); + ControlProtocol (Session&, std::string name, PBD::EventLoop* event_loop); virtual ~ControlProtocol(); std::string name() const { return _name; } @@ -99,11 +99,13 @@ class ControlProtocol : virtual public sigc::trackable, public PBD::Stateful, pu std::string route_get_name (uint32_t table_index); protected: + PBD::EventLoop* _event_loop; + bool _own_event_loop; std::vector<boost::shared_ptr<ARDOUR::Route> > route_table; std::string _name; bool _active; - void add_strip (std::list<boost::shared_ptr<ARDOUR::Route> >); + void add_strip (std::list<boost::shared_ptr<ARDOUR::Route> >&); void next_track (uint32_t initial_id); void prev_track (uint32_t initial_id); diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc index e9f12638b6..c3d7aabfaf 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc @@ -30,6 +30,7 @@ #include "ardour/session.h" #include "ardour/route.h" +#include "ardour/midi_ui.h" #include "generic_midi_control_protocol.h" #include "midicontrollable.h" @@ -39,8 +40,11 @@ using namespace PBD; #include "i18n.h" +#define midi_ui_context() MidiControlUI::instance() /* a UICallback-derived object that specifies the event loop for signal handling */ +#define ui_bind(x) boost::protect (boost::bind ((x))) + GenericMidiControlProtocol::GenericMidiControlProtocol (Session& s) - : ControlProtocol (s, _("Generic MIDI")) + : ControlProtocol (s, _("Generic MIDI"), MidiControlUI::instance()) { MIDI::Manager* mm = MIDI::Manager::instance(); @@ -59,16 +63,14 @@ GenericMidiControlProtocol::GenericMidiControlProtocol (Session& s) _feedback_interval = 10000; // microseconds last_feedback_time = 0; - auto_binding = FALSE; + /* XXX is it right to do all these in the same thread as whatever emits the signal? */ - Controllable::StartLearning.connect (*this, boost::bind (&GenericMidiControlProtocol::start_learning, this, _1)); - Controllable::StopLearning.connect (*this, boost::bind (&GenericMidiControlProtocol::stop_learning, this, _1)); - Controllable::CreateBinding.connect (*this, boost::bind (&GenericMidiControlProtocol::create_binding, this, _1, _2, _3)); - Controllable::DeleteBinding.connect (*this, boost::bind (&GenericMidiControlProtocol::delete_binding, this, _1)); + Controllable::StartLearning.connect_same_thread (*this, boost::bind (&GenericMidiControlProtocol::start_learning, this, _1)); + Controllable::StopLearning.connect_same_thread (*this, boost::bind (&GenericMidiControlProtocol::stop_learning, this, _1)); + Controllable::CreateBinding.connect_same_thread (*this, boost::bind (&GenericMidiControlProtocol::create_binding, this, _1, _2, _3)); + Controllable::DeleteBinding.connect_same_thread (*this, boost::bind (&GenericMidiControlProtocol::delete_binding, this, _1)); - Session::SendFeedback.connect (*this, boost::bind (&GenericMidiControlProtocol::send_feedback, this)); - Session::AutoBindingOn.connect (*this, boost::bind (&GenericMidiControlProtocol::auto_binding_on, this)); - Session::AutoBindingOff.connect (*this, boost::bind (&GenericMidiControlProtocol::auto_binding_off, this)); + Session::SendFeedback.connect (*this, boost::bind (&GenericMidiControlProtocol::send_feedback, this), midi_ui_context());; } GenericMidiControlProtocol::~GenericMidiControlProtocol () @@ -177,7 +179,7 @@ GenericMidiControlProtocol::start_learning (Controllable* c) MIDIPendingControllable* element = new MIDIPendingControllable; element->first = mc; - c->LearningFinished.connect (element->second, boost::bind (&GenericMidiControlProtocol::learning_stopped, this, mc)); + c->LearningFinished.connect_same_thread (element->second, boost::bind (&GenericMidiControlProtocol::learning_stopped, this, mc)); pending_controllables.push_back (element); } @@ -289,18 +291,6 @@ GenericMidiControlProtocol::create_binding (PBD::Controllable* control, int pos, } } -void -GenericMidiControlProtocol::auto_binding_on() -{ - auto_binding = TRUE; -} - -void -GenericMidiControlProtocol::auto_binding_off() -{ - auto_binding = FALSE; -} - XMLNode& GenericMidiControlProtocol::get_state () { @@ -345,46 +335,43 @@ GenericMidiControlProtocol::set_state (const XMLNode& node, int version) _feedback_interval = 10000; } - if ( !auto_binding ) { - - boost::shared_ptr<Controllable> c; - - { - Glib::Mutex::Lock lm (pending_lock); - for (MIDIPendingControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ++i) { - delete *i; - } - pending_controllables.clear (); - } - - Glib::Mutex::Lock lm2 (controllables_lock); - controllables.clear (); - nlist = node.children(); // "controls" - - if (nlist.empty()) { - return 0; + boost::shared_ptr<Controllable> c; + + { + Glib::Mutex::Lock lm (pending_lock); + for (MIDIPendingControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ++i) { + delete *i; } + pending_controllables.clear (); + } + + Glib::Mutex::Lock lm2 (controllables_lock); + controllables.clear (); + nlist = node.children(); // "controls" + + if (nlist.empty()) { + return 0; + } + + nlist = nlist.front()->children (); - nlist = nlist.front()->children (); + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { - for (niter = nlist.begin(); niter != nlist.end(); ++niter) { + if ((prop = (*niter)->property ("id")) != 0) { - if ((prop = (*niter)->property ("id")) != 0) { - - ID id = prop->value (); - c = session->controllable_by_id (id); - - if (c) { - MIDIControllable* mc = new MIDIControllable (*_port, *c); - if (mc->set_state (**niter, version) == 0) { - controllables.insert (mc); - } - - } else { - warning << string_compose ( - _("Generic MIDI control: controllable %1 not found in session (ignored)"), - id) << endmsg; + ID id = prop->value (); + c = session->controllable_by_id (id); + + if (c) { + MIDIControllable* mc = new MIDIControllable (*_port, *c); + if (mc->set_state (**niter, version) == 0) { + controllables.insert (mc); } + + } else { + warning << string_compose ( + _("Generic MIDI control: controllable %1 not found in session (ignored)"), + id) << endmsg; } } } diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h index c42d796e81..39958bcf26 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h @@ -44,7 +44,6 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { ARDOUR::microseconds_t last_feedback_time; bool do_feedback; - bool auto_binding; void _send_feedback (); void send_feedback (); @@ -64,10 +63,6 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { void create_binding (PBD::Controllable*, int, int); void delete_binding (PBD::Controllable*); - - void auto_binding_on(); - void auto_binding_off(); - }; #endif /* ardour_generic_midi_control_protocol_h */ diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc index a1f5abf3b0..d6b4007194 100644 --- a/libs/surfaces/generic_midi/midicontrollable.cc +++ b/libs/surfaces/generic_midi/midicontrollable.cc @@ -19,10 +19,13 @@ #include <cstdio> /* for sprintf, sigh */ #include <climits> + #include "pbd/error.h" #include "pbd/xml++.h" + #include "midi++/port.h" #include "midi++/channel.h" + #include "ardour/automation_control.h" #include "midicontrollable.h" @@ -111,7 +114,7 @@ void MIDIControllable::learn_about_external_control () { drop_external_control (); - _port.input()->any.connect (midi_learn_connection, boost::bind (&MIDIControllable::midi_receiver, this, _1, _2, _3)); + _port.input()->any.connect_same_thread (midi_learn_connection, boost::bind (&MIDIControllable::midi_receiver, this, _1, _2, _3)); } void @@ -285,43 +288,43 @@ MIDIControllable::bind_midi (channel_t chn, eventType ev, MIDI::byte additional) int chn_i = chn; switch (ev) { case MIDI::off: - p.channel_note_off[chn_i].connect (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_note_off, this, _1, _2)); + p.channel_note_off[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_note_off, this, _1, _2)); /* if this is a bistate, connect to noteOn as well, and we'll toggle back and forth between the two. */ if (bistate) { - p.channel_note_on[chn_i].connect (midi_sense_connection[1], boost::bind (&MIDIControllable::midi_sense_note_on, this, _1, _2)); + p.channel_note_on[chn_i].connect_same_thread (midi_sense_connection[1], boost::bind (&MIDIControllable::midi_sense_note_on, this, _1, _2)); } _control_description = "MIDI control: NoteOff"; break; case MIDI::on: - p.channel_note_on[chn_i].connect (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_note_on, this, _1, _2)); + p.channel_note_on[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_note_on, this, _1, _2)); if (bistate) { - p.channel_note_off[chn_i].connect (midi_sense_connection[1], boost::bind (&MIDIControllable::midi_sense_note_off, this, _1, _2)); + p.channel_note_off[chn_i].connect_same_thread (midi_sense_connection[1], boost::bind (&MIDIControllable::midi_sense_note_off, this, _1, _2)); } _control_description = "MIDI control: NoteOn"; break; case MIDI::controller: - p.channel_controller[chn_i].connect (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_controller, this, _1, _2)); + p.channel_controller[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_controller, this, _1, _2)); snprintf (buf, sizeof (buf), "MIDI control: Controller %d", control_additional); _control_description = buf; break; case MIDI::program: if (!bistate) { - p.channel_program_change[chn_i].connect (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_program_change, this, _1, _2)); + p.channel_program_change[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_program_change, this, _1, _2)); _control_description = "MIDI control: ProgramChange"; } break; case MIDI::pitchbend: if (!bistate) { - p.channel_pitchbend[chn_i].connect (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_pitchbend, this, _1, _2)); + p.channel_pitchbend[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_pitchbend, this, _1, _2)); _control_description = "MIDI control: Pitchbend"; } break; diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc index 9f4ffb10c0..48d074e117 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.cc +++ b/libs/surfaces/mackie/mackie_control_protocol.cc @@ -43,6 +43,7 @@ #include "ardour/dB.h" #include "ardour/debug.h" #include "ardour/location.h" +#include "ardour/midi_ui.h" #include "ardour/panner.h" #include "ardour/route.h" #include "ardour/session.h" @@ -71,8 +72,11 @@ using boost::shared_ptr; MackieMidiBuilder builder; +#define midi_ui_context() MidiControlUI::instance() /* a UICallback-derived object that specifies the event loop for signal handling */ +#define ui_bind(f, ...) boost::protect (boost::bind (f, __VA_ARGS__)) + MackieControlProtocol::MackieControlProtocol (Session& session) - : ControlProtocol (session, X_("Mackie")) + : ControlProtocol (session, X_("Mackie"), MidiControlUI::instance()) , _current_initial_bank (0) , _surface (0) , _jog_wheel (*this) @@ -536,23 +540,23 @@ void MackieControlProtocol::connect_session_signals() { // receive routes added - session->RouteAdded.connect(session_connections, boost::bind (&MackieControlProtocol::notify_route_added, this, _1)); + session->RouteAdded.connect(session_connections, ui_bind (&MackieControlProtocol::notify_route_added, this, _1), midi_ui_context()); // receive record state toggled - session->RecordStateChanged.connect(session_connections, boost::bind (&MackieControlProtocol::notify_record_state_changed, this)); + session->RecordStateChanged.connect(session_connections, ui_bind (&MackieControlProtocol::notify_record_state_changed, this), midi_ui_context()); // receive transport state changed - session->TransportStateChange.connect(session_connections, boost::bind (&MackieControlProtocol::notify_transport_state_changed, this)); + session->TransportStateChange.connect(session_connections, ui_bind (&MackieControlProtocol::notify_transport_state_changed, this), midi_ui_context()); // receive punch-in and punch-out - Config->ParameterChanged.connect(session_connections, boost::bind (&MackieControlProtocol::notify_parameter_changed, this, _1)); - session->config.ParameterChanged.connect (session_connections, boost::bind (&MackieControlProtocol::notify_parameter_changed, this, _1)); + Config->ParameterChanged.connect(session_connections, ui_bind (&MackieControlProtocol::notify_parameter_changed, this, _1), midi_ui_context()); + session->config.ParameterChanged.connect (session_connections, ui_bind (&MackieControlProtocol::notify_parameter_changed, this, _1), midi_ui_context()); // receive rude solo changed - session->SoloActive.connect(session_connections, boost::bind (&MackieControlProtocol::notify_solo_active_changed, this, _1)); + session->SoloActive.connect(session_connections, ui_bind (&MackieControlProtocol::notify_solo_active_changed, this, _1), midi_ui_context()); // make sure remote id changed signals reach here // see also notify_route_added Sorted sorted = get_sorted_routes(); for (Sorted::iterator it = sorted.begin(); it != sorted.end(); ++it) { - ((*it)->RemoteControlIDChanged.connect (route_connections, boost::bind(&MackieControlProtocol::notify_remote_id_changed, this))); + (*it)->RemoteControlIDChanged.connect (route_connections, ui_bind(&MackieControlProtocol::notify_remote_id_changed, this), midi_ui_context()); } } @@ -569,9 +573,9 @@ MackieControlProtocol::add_port (MIDI::Port & midi_port, int number) MackiePort * sport = new MackiePort (*this, midi_port, number); _ports.push_back (sport); - sport->init_event.connect (port_connections, boost::bind (&MackieControlProtocol::handle_port_init, this, sport)); - sport->active_event.connect (port_connections, boost::bind (&MackieControlProtocol::handle_port_active, this, sport)); - sport->inactive_event.connect (port_connections, boost::bind (&MackieControlProtocol::handle_port_inactive, this, sport)); + sport->init_event.connect_same_thread (port_connections, boost::bind (&MackieControlProtocol::handle_port_init, this, sport)); + sport->active_event.connect_same_thread (port_connections, boost::bind (&MackieControlProtocol::handle_port_active, this, sport)); + sport->inactive_event.connect_same_thread (port_connections, boost::bind (&MackieControlProtocol::handle_port_inactive, this, sport)); } } @@ -652,7 +656,7 @@ MackieControlProtocol::initialize_surface() // Connect events. Must be after route table otherwise there will be trouble for (MackiePorts::iterator it = _ports.begin(); it != _ports.end(); ++it) { - (*it)->control_event.connect (port_connections, boost::bind (&MackieControlProtocol::handle_control_event, this, _1, _2, _3)); + (*it)->control_event.connect_same_thread (port_connections, boost::bind (&MackieControlProtocol::handle_control_event, this, _1, _2, _3)); } } @@ -1409,7 +1413,7 @@ MackieControlProtocol::notify_route_added (ARDOUR::RouteList & rl) typedef ARDOUR::RouteList ARS; for (ARS::iterator it = rl.begin(); it != rl.end(); ++it) { - (*it)->RemoteControlIDChanged.connect (route_connections, boost::bind (&MackieControlProtocol::notify_remote_id_changed, this)); + (*it)->RemoteControlIDChanged.connect (route_connections, ui_bind (&MackieControlProtocol::notify_remote_id_changed, this), midi_ui_context()); } } diff --git a/libs/surfaces/mackie/mackie_port.cc b/libs/surfaces/mackie/mackie_port.cc index 069ad9abb4..476e6acb81 100644 --- a/libs/surfaces/mackie/mackie_port.cc +++ b/libs/surfaces/mackie/mackie_port.cc @@ -90,7 +90,7 @@ void MackiePort::open() { DEBUG_TRACE (DEBUG::MackieControl, string_compose ("MackiePort::open %1\n", *this)); - port().input()->sysex.connect (sysex_connection, boost::bind (&MackiePort::handle_midi_sysex, this, _1, _2, _3)); + port().input()->sysex.connect_same_thread (sysex_connection, boost::bind (&MackiePort::handle_midi_sysex, this, _1, _2, _3)); // make sure the device is connected init(); @@ -272,7 +272,7 @@ void MackiePort::finalise_init( bool yn ) void MackiePort::connect_any() { if (!any_connection.connected()) { - port().input()->any.connect (any_connection, boost::bind (&MackiePort::handle_midi_any, this, _1, _2, _3)); + port().input()->any.connect_same_thread (any_connection, boost::bind (&MackiePort::handle_midi_any, this, _1, _2, _3)); } } diff --git a/libs/surfaces/mackie/route_signal.cc b/libs/surfaces/mackie/route_signal.cc index 9a3dd41bf4..6dc8532db9 100644 --- a/libs/surfaces/mackie/route_signal.cc +++ b/libs/surfaces/mackie/route_signal.cc @@ -19,6 +19,7 @@ #include "ardour/route.h" #include "ardour/track.h" +#include "ardour/midi_ui.h" #include "ardour/panner.h" #include "mackie_control_protocol.h" @@ -29,38 +30,41 @@ using namespace ARDOUR; using namespace Mackie; using namespace std; +#define midi_ui_context() MidiControlUI::instance() /* a UICallback-derived object that specifies the event loop for signal handling */ +#define ui_bind(f, ...) boost::protect (boost::bind (f, __VA_ARGS__)) + void RouteSignal::connect() { if (_strip.has_solo()) { - _route->solo_control()->Changed.connect(connections, boost::bind (&MackieControlProtocol::notify_solo_changed, &_mcp, this)); + _route->solo_control()->Changed.connect(connections, ui_bind (&MackieControlProtocol::notify_solo_changed, &_mcp, this), midi_ui_context()); } if (_strip.has_mute()) { - _route->mute_control()->Changed.connect(connections, boost::bind (&MackieControlProtocol::notify_mute_changed, &_mcp, this)); + _route->mute_control()->Changed.connect(connections, ui_bind (&MackieControlProtocol::notify_mute_changed, &_mcp, this), midi_ui_context()); } if (_strip.has_gain()) { - _route->gain_control()->Changed.connect(connections, boost::bind (&MackieControlProtocol::notify_gain_changed, &_mcp, this, false)); + _route->gain_control()->Changed.connect(connections, ui_bind (&MackieControlProtocol::notify_gain_changed, &_mcp, this, false), midi_ui_context()); } - _route->NameChanged.connect (connections, boost::bind (&MackieControlProtocol::notify_name_changed, &_mcp, this)); + _route->NameChanged.connect (connections, ui_bind (&MackieControlProtocol::notify_name_changed, &_mcp, this), midi_ui_context()); if (_route->panner()) { - _route->panner()->Changed.connect(connections, boost::bind (&MackieControlProtocol::notify_panner_changed, &_mcp, this, false)); + _route->panner()->Changed.connect(connections, ui_bind (&MackieControlProtocol::notify_panner_changed, &_mcp, this, false), midi_ui_context()); for ( unsigned int i = 0; i < _route->panner()->npanners(); ++i ) { - _route->panner()->streampanner(i).Changed.connect (connections, boost::bind (&MackieControlProtocol::notify_panner_changed, &_mcp, this, false)); + _route->panner()->streampanner(i).Changed.connect (connections, ui_bind (&MackieControlProtocol::notify_panner_changed, &_mcp, this, false), midi_ui_context()); } } boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<ARDOUR::Track>(_route); if (trk) { - trk->rec_enable_control()->Changed .connect(connections, boost::bind (&MackieControlProtocol::notify_record_enable_changed, &_mcp, this)); + trk->rec_enable_control()->Changed .connect(connections, ui_bind (&MackieControlProtocol::notify_record_enable_changed, &_mcp, this), midi_ui_context()); } // TODO this works when a currently-banked route is made inactive, but not // when a route is activated which should be currently banked. - _route->active_changed.connect (connections, boost::bind (&MackieControlProtocol::notify_active_changed, &_mcp, this)); + _route->active_changed.connect (connections, ui_bind (&MackieControlProtocol::notify_active_changed, &_mcp, this), midi_ui_context()); // TODO // SelectedChanged diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index a076b161e7..6054d01334 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -51,9 +51,12 @@ using namespace ARDOUR; using namespace std; using namespace Glib; - #include "pbd/abstract_ui.cc" // instantiate template +#define ui_bind(f, ...) boost::protect (boost::bind (f, __VA_ARGS__)) + +OSC* OSC::_instance = 0; + #ifdef DEBUG static void error_callback(int num, const char *m, const char *path) { @@ -67,10 +70,11 @@ static void error_callback(int, const char *, const char *) #endif OSC::OSC (Session& s, uint32_t port) - : ControlProtocol (s, "OSC") + : ControlProtocol (s, "OSC", this) , AbstractUI<OSCUIRequest> ("osc") , _port(port) { + _instance = this; _shutdown = false; _osc_server = 0; _osc_unix_server = 0; @@ -83,12 +87,13 @@ OSC::OSC (Session& s, uint32_t port) // "Application Hooks" session_loaded (s); - session->Exported.connect (*this, boost::bind (&OSC::session_exported, this, _1, _2)); + session->Exported.connect (*this, ui_bind (&OSC::session_exported, this, _1, _2), this); } OSC::~OSC() { stop (); + _instance = 0; } void @@ -573,7 +578,7 @@ OSC::listen_to_route (boost::shared_ptr<Route> route, lo_address addr) */ if (!route_exists) { - route->GoingAway.connect (*this, boost::bind (&OSC::drop_route, this, boost::weak_ptr<Route> (route))); + route->GoingAway.connect (*this, boost::bind (&OSC::drop_route, this, boost::weak_ptr<Route> (route)), this); } } diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index 15914bfbbd..0c72671ae9 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -60,6 +60,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> OSC (ARDOUR::Session&, uint32_t port); virtual ~OSC(); + static OSC* instance() { return _instance; } + XMLNode& get_state (); int set_state (const XMLNode&, int version); @@ -182,8 +184,10 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> void drop_route (boost::weak_ptr<ARDOUR::Route>); typedef std::list<OSCControllable*> Controllables; - + Controllables controllables; + + static OSC* _instance; }; #endif // ardour_osc_h diff --git a/libs/surfaces/osc/osc_controllable.cc b/libs/surfaces/osc/osc_controllable.cc index f5deadd41d..baf888667e 100644 --- a/libs/surfaces/osc/osc_controllable.cc +++ b/libs/surfaces/osc/osc_controllable.cc @@ -24,6 +24,7 @@ #include "ardour/route.h" +#include "osc.h" #include "osc_controllable.h" using namespace sigc; @@ -35,7 +36,7 @@ OSCControllable::OSCControllable (lo_address a, const std::string& p, boost::sha , addr (a) , path (p) { - c->Changed.connect (changed_connection, mem_fun (*this, &OSCControllable::send_change)); + c->Changed.connect (changed_connection, boost::bind (&OSCControllable::send_change, this), OSC::instance()); } OSCControllable::~OSCControllable () diff --git a/libs/surfaces/osc/osc_controllable.h b/libs/surfaces/osc/osc_controllable.h index 67b8284460..55e2815d35 100644 --- a/libs/surfaces/osc/osc_controllable.h +++ b/libs/surfaces/osc/osc_controllable.h @@ -30,9 +30,7 @@ #include "ardour/types.h" namespace ARDOUR { - -class Route; - + class Route; } class OSCControllable : public PBD::Stateful diff --git a/libs/surfaces/powermate/powermate.cc b/libs/surfaces/powermate/powermate.cc index 31154ad879..a3b535c9e0 100644 --- a/libs/surfaces/powermate/powermate.cc +++ b/libs/surfaces/powermate/powermate.cc @@ -89,7 +89,7 @@ int find_powermate(int mode) } PowermateControlProtocol::PowermateControlProtocol (Session& s) - : ControlProtocol (s, "powermate") + : ControlProtocol (s, "powermate", 0 /* XXX need an event loop here */) { } |