fully implement and deploy explicit x-thread signal connection syntax (testing comes...
authorPaul Davis <paul@linuxaudiosystems.com>
Mon, 21 Dec 2009 18:23:07 +0000 (18:23 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 21 Dec 2009 18:23:07 +0000 (18:23 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6379 d708f5d6-7413-0410-9779-e7cbd77b26cf

154 files changed:
gtk2_ardour/ardour_ui.cc
gtk2_ardour/ardour_ui_dialogs.cc
gtk2_ardour/ardour_ui_options.cc
gtk2_ardour/audio_clock.cc
gtk2_ardour/audio_region_editor.cc
gtk2_ardour/audio_region_view.cc
gtk2_ardour/audio_streamview.cc
gtk2_ardour/audio_time_axis.cc
gtk2_ardour/automation_controller.cc
gtk2_ardour/automation_line.cc
gtk2_ardour/automation_region_view.cc
gtk2_ardour/automation_streamview.cc
gtk2_ardour/automation_time_axis.cc
gtk2_ardour/automation_time_axis.h
gtk2_ardour/bundle_manager.cc
gtk2_ardour/crossfade_edit.cc
gtk2_ardour/crossfade_view.cc
gtk2_ardour/editor.cc
gtk2_ardour/editor_drag.cc
gtk2_ardour/editor_drag.h
gtk2_ardour/editor_imageframe.cc
gtk2_ardour/editor_markers.cc
gtk2_ardour/editor_mixer.cc
gtk2_ardour/editor_regions.cc
gtk2_ardour/editor_route_groups.cc
gtk2_ardour/editor_routes.cc
gtk2_ardour/editor_summary.cc
gtk2_ardour/export_dialog.cc
gtk2_ardour/export_file_notebook.cc
gtk2_ardour/export_format_dialog.cc
gtk2_ardour/gain_meter.cc
gtk2_ardour/generic_pluginui.cc
gtk2_ardour/group_tabs.cc
gtk2_ardour/gui_thread.h
gtk2_ardour/imageframe_time_axis.cc
gtk2_ardour/imageframe_time_axis_group.cc
gtk2_ardour/imageframe_time_axis_view.cc
gtk2_ardour/imageframe_view.cc
gtk2_ardour/io_selector.cc
gtk2_ardour/io_selector.h
gtk2_ardour/level_meter.cc
gtk2_ardour/location_ui.cc
gtk2_ardour/lv2_plugin_ui.cc
gtk2_ardour/marker_time_axis_view.cc
gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_region_view.h
gtk2_ardour/midi_streamview.cc
gtk2_ardour/midi_time_axis.cc
gtk2_ardour/mixer_strip.cc
gtk2_ardour/mixer_strip.h
gtk2_ardour/mixer_ui.cc
gtk2_ardour/option_editor.cc
gtk2_ardour/panner2d.cc
gtk2_ardour/panner_ui.cc
gtk2_ardour/plugin_eq_gui.cc
gtk2_ardour/plugin_selector.cc
gtk2_ardour/plugin_ui.cc
gtk2_ardour/plugin_ui.h
gtk2_ardour/port_group.cc
gtk2_ardour/port_group.h
gtk2_ardour/port_matrix.cc
gtk2_ardour/port_matrix_body.cc
gtk2_ardour/processor_box.cc
gtk2_ardour/rc_option_editor.cc
gtk2_ardour/region_selection.cc
gtk2_ardour/region_selection.h
gtk2_ardour/region_view.cc
gtk2_ardour/return_ui.cc
gtk2_ardour/return_ui.h
gtk2_ardour/route_params_ui.cc
gtk2_ardour/route_params_ui.h
gtk2_ardour/route_processor_selection.cc
gtk2_ardour/route_time_axis.cc
gtk2_ardour/route_ui.cc
gtk2_ardour/selection.cc
gtk2_ardour/send_ui.cc
gtk2_ardour/send_ui.h
gtk2_ardour/session_import_dialog.cc
gtk2_ardour/session_option_editor.cc
gtk2_ardour/splash.cc
gtk2_ardour/streamview.cc
gtk2_ardour/streamview.h
gtk2_ardour/strip_silence_dialog.cc
gtk2_ardour/strip_silence_dialog.h
gtk2_ardour/tape_region_view.cc
gtk2_ardour/time_axis_view.cc
libs/ardour/ardour/audiosource.h
libs/ardour/ardour/midi_ui.h
libs/ardour/ardour/session_event.h
libs/ardour/audio_diskstream.cc
libs/ardour/audio_playlist.cc
libs/ardour/audio_track.cc
libs/ardour/audioregion.cc
libs/ardour/audiosource.cc
libs/ardour/auditioner.cc
libs/ardour/delivery.cc
libs/ardour/diskstream.cc
libs/ardour/export_channel.cc
libs/ardour/export_format_manager.cc
libs/ardour/export_formats.cc
libs/ardour/export_handler.cc
libs/ardour/internal_return.cc
libs/ardour/internal_send.cc
libs/ardour/io.cc
libs/ardour/midi_clock_slave.cc
libs/ardour/midi_diskstream.cc
libs/ardour/midi_region.cc
libs/ardour/midi_track.cc
libs/ardour/midi_ui.cc
libs/ardour/mtc_slave.cc
libs/ardour/playlist.cc
libs/ardour/region.cc
libs/ardour/route.cc
libs/ardour/route_group.cc
libs/ardour/session.cc
libs/ardour/session_export.cc
libs/ardour/session_handle.cc
libs/ardour/session_midi.cc
libs/ardour/session_playlists.cc
libs/ardour/session_rtevents.cc
libs/ardour/session_state.cc
libs/ardour/sndfilesource.cc
libs/ardour/ticker.cc
libs/gtkmm2ext/binding_proxy.cc
libs/gtkmm2ext/gtk_ui.cc
libs/midi++2/channel.cc
libs/midi++2/midi++/fd_midiport.h
libs/midi++2/mmc.cc
libs/midi++2/parser.cc
libs/pbd/base_ui.cc
libs/pbd/controllable.cc
libs/pbd/event_loop.cc [new file with mode: 0644]
libs/pbd/pbd/base_ui.h
libs/pbd/pbd/event_loop.h [new file with mode: 0644]
libs/pbd/pbd/memento_command.h
libs/pbd/pbd/shiva.h [deleted file]
libs/pbd/pbd/signals.h
libs/pbd/pbd/ui_callback.h [deleted file]
libs/pbd/ui_callback.cc [deleted file]
libs/pbd/undo.cc
libs/pbd/wscript
libs/surfaces/control_protocol/control_protocol.cc
libs/surfaces/control_protocol/control_protocol/control_protocol.h
libs/surfaces/generic_midi/generic_midi_control_protocol.cc
libs/surfaces/generic_midi/generic_midi_control_protocol.h
libs/surfaces/generic_midi/midicontrollable.cc
libs/surfaces/mackie/mackie_control_protocol.cc
libs/surfaces/mackie/mackie_port.cc
libs/surfaces/mackie/route_signal.cc
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h
libs/surfaces/osc/osc_controllable.cc
libs/surfaces/osc/osc_controllable.h
libs/surfaces/powermate/powermate.cc

index 7deeae7bf76ebd756c8c6708f20fd69a290ea6a2..23df74e6fd07f9342a978efb8b64d19fa225947c 100644 (file)
@@ -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);
 
index 7cbf0df3e2ca6d98f2af32766ede7fa4cd5d6472..a15d8fc2bee3c6878411c1bb4b037e6f54c33af7 100644 (file)
@@ -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.
        */
index f917fd429d6bf99c223f0be47e4e0f35e2831e6a..acd49fb2a9ada61512cbdfce11e192cd84f4ab36 100644 (file)
@@ -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);
 }
index 0847031df4afb84673d655679e4440c5095674b6..86497709c633abc1c636a50291a9056158c72525 100644 (file)
@@ -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 ();
index c95ecc56168660bc9507cd46ecbf5746f205a887..90875a08d405b5b3fd6ef6db065cb0276a50c564 100644 (file)
@@ -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
index 371324210188b1d0fe200238c6a5456e0424df34..b8f08456d49f782993601726e7504fa75c9a3f9a 100644 (file)
@@ -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;
 }
index 6fb481db2d48a16551187261e50da0006023bb86..b95377a58c2e8b878984cfd5a8de2bfbb38a5a76 100644 (file)
@@ -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());
                                        }
                                }
 
index 0105e1846cc5e0214d4aed22bee3b27bb6f6f9ac..7236c5dea63d2c77d0927a7cb38e88cc64982f74 100644 (file)
@@ -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 */
index ba0802416141face2dc03e16d963d7871ef80d37..1a32c36b62463efa41a4be02868c842dedff9885 100644 (file)
@@ -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()
index 726de984a001ab0f9169aace18db73b5ed403078..8091e3488f0e0916448b2b249741466856550d52 100644 (file)
@@ -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);
 
index bcb637602766019ba28461b202489de113478ad5..5e13ee55fd0134782f27e3b2e50e1a1be4e5a363 100644 (file)
@@ -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 ();
 
index 731374eb2d59413382ae92351aba132df15d749c..c8dc0ae3c4bd11972e451cb61e39ae7662ab937b 100644 (file)
@@ -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);
 
index fa507448b4c7eb4e15cbcf3da5dec2184bd99dbd..5454c9991f932a2ba8fd8276be7bc758f00c6487 100644 (file)
@@ -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);
index f00d0a24fe9816059a1110f0c22fc991664b0e0d..05e0746bf2c9982a188ff89ee5a284301c85e616 100644 (file)
@@ -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);
 
index 9b4b2b6bdeaac7b45910bf7c9c403157697fa763..a65f5bae353ecc6a92811dc054249413a9c6fbac 100644 (file)
 #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) {
index afb595938d47ed939094efbbf41a72a22cf33502..fd651599eace91d6bf0a36b35b5f89f696fc9beb 100644 (file)
@@ -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();
index 3a34ace7fa4f12004c876291f79878aa18ab8321..41134e5096b327f052e88d41a4bf07451006daff 100644 (file)
@@ -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));
 }
 
index 9bf2ccbc5d7e37230efecc40665e606004ec01cb..8b98273229761da22522113dd406425291c4dfdb 100644 (file)
@@ -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);
index 4f864309f9bcd9ef370a283ed731f552c31eae43..907abfc3480586ba0bc5608f0e98ba013f053bf8 100644 (file)
@@ -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
index 170c9a80802c84043e8641f790a1780fb2401c3a..95b22221a3cdfeb85ebb1b9643619c838b89a348 100644 (file)
@@ -160,7 +160,7 @@ protected:
 
 private:
        void region_going_away (RegionView *);
-       boost::signals2::scoped_connection death_connection;
+       PBD::ScopedConnection death_connection;
 };
 
 
index 7f499c0c6fb504f8e41f94b32fc4468806b0ea8a..4b0601fceacbcee650257c492c5bfd386f2ac5ed 100644 (file)
@@ -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());
  }
 
 
index dbee2fb9d2bd3e34c1fa967d4b7eea7e24e8831b..79fd056126c580339a43dfe962c1bdcd4c107612 100644 (file)
@@ -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;
 
index 6cb6046006ed0ad0e8cfa67b623e782e86c91d82..64d9e97ac6f63d4d7250b2b2e44444c5e5337df4 100644 (file)
@@ -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
index 26ae2f6f502dd4fb7614886edd4b0c51feb3d4ae..490f6991e3aa2be19a626c436d1f36e5158eb8bd 100644 (file)
@@ -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 ();
index c52817a15aa17c878e8722b3cd1c07eebfb7578d..9cbb2725c2ee790119863d1cb49cb8af0afedf70 100644 (file)
@@ -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 ();
index 3ef66161fbb53b5fc876d6cb3f6f5f00ac0e3d16..b18d35a5e33cf3c6cb7b623268dbbf620bb54db5 100644 (file)
@@ -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 ();
index 93be5afd1330dced67636466c3ec1b76b2940245..aae814d8e564df3945e4a0c2be4d3a95076ae25c 100644 (file)
@@ -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());
        }
 }
 
index 84202d57ea2149963672ef5b4c2c1a65abe0b3b8..0f5c6a455133cd8335d7b24512688f606f941a9c 100644 (file)
@@ -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 ();
 }
index 5961715d835450972221db171c08fa6cf4d07fe7..c785d14be1ac83d4f43c3b6fe999d8f800ae739b 100644 (file)
@@ -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));
index 1c93115da3275d9f2157d975608e73e928a191bc..1b0a511ac3d237000f02a4049edcea86b15381ab 100644 (file)
 
 */
 
-#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);
index 3c3b70c7cfacbc96e6314730ec966f7451aa0edd..961ceb6a4a9c68c6d437a09840e9becff9076343 100644 (file)
@@ -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 ();
index 1865c1e0a2d16e640efd9e278ec96a14bf1e5822..3d59910ff4ff9382de3c26fa0f0e3b03961150a9 100644 (file)
@@ -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;
 }
index 17cec93f82f0e483079aea0aa8d9b560e13ea262..8e7b8f0607cbc9919fc6f2c56c0edf461aa96aa7 100644 (file)
@@ -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());
        }
 }
 
index f932c603ac68d4e495df1b01b6032ddac21006d1..edea9b9d21d887674c23faa4a34ef73379441abc 100644 (file)
@@ -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__ */
index 9dbcb313923a7aff54cf73182322a51566c412e0..270dd0145401fef05b695d8df514dda727c7b457 100644 (file)
@@ -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 ;
index 4c33d73dfcfd0c2bf015c2d0b598d341203c6010..a555d5254b084286f1f2a73bfc8efd1e9264de78 100644 (file)
@@ -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 */
        }
index 05dda6bc8ea081b9845e6cc17e7167203cb46496..5c00bc1e599d5ee2262563ef7cfa46b1c3dcb835 100644 (file)
@@ -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 */
        }
index 273ac30b992ae63dd5fa80d56112d1b2b555a1be..1d8f5ceab780fe05b262950a5dfeadd0ddb53615 100644 (file)
@@ -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 */
 }
index e038035a95198e26e2ad15d8b471bd2b35ece463..bc8f3b88906c856a517116c00012a99b9e1c3b9c 100644 (file)
@@ -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
index 63e02a2a75bc9243eccf2caca77d584a9fc16201..a4545dbfc43c34133ce4757d8bdab5c277539a4f 100644 (file)
@@ -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*);
 };
index c0908d82953551290ac8a26423ec0f6ef5224df5..679c5ac2b5163d0ffe8ef6b58d3a82691b67ef09 100644 (file)
@@ -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());
        }
 }
 
index 61a0ec1405c2569673bfe4f9d1bee579e68858ef..439d64971bb0b6f39b2caeb005342854232372e4 100644 (file)
@@ -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 ();
index 2f108efc8a928616b38d56d96abe9c4b8a5bc512..d736ba723d026e9f438f06ac747f53509d4578bc 100644 (file)
@@ -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 ()
index 2d9a30b0a32050c1f0a73cae1573aa8d4601ed9c..6e955146a2c1c257fcc4dbad873d565279064198 100644 (file)
@@ -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 */
 
index 4f0c25a72c9acca579b60b059d2d7991e996c35c..8d186eac9bf9088da60e2ccb443e120166147926 100644 (file)
@@ -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;
 }
index e8c25e864766666151bbcb9e87c34e4fbaa1af8d..66f0393f3d71389582f19e19e770c5828ee6e4c4 100644 (file)
@@ -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;
index 76d34a4a5079e4ff7e04fce79da3740b6b0591a5..0d50c8910f2275400aa503954573e209953a502f 100644 (file)
@@ -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
 
index 3b1ad17a2215664102b579e663027969c5e3af73..3b759867c89ad7160ea97e8369ddfbf511c02cd1 100644 (file)
@@ -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());
index 275cd14b0276caf67a178ffa6b3a2342c95c6e8e..9578e8dd0cab9ff5e05988c1ad023308f49ca4f2 100644 (file)
@@ -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 ();
index 64579e0c33864b9e0c242d00bd3337acaea42241..0e432eed3ef7939ae820eacd4ff26daef702f06b 100644 (file)
@@ -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 ();
 
index 0484db6fe720b4ae19476d10a745106bc048d402..799352c87d5d4d290e43503bdc8c1eb948d59f19 100644 (file)
@@ -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);
index f11731b6de7a2711163208dc65e74fa1bec55cca..b779d24421c9d25df4670da11bb7d7824ead1a56 100644 (file)
@@ -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 ()
index 8b7f5802b56ac6173c809b852273d7458486b9cc..3e70472ffe29f21174afb3297442d2562e7e096e 100644 (file)
@@ -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);
index 4321a7ebad774c0f6d3dacfb03565c18e03570e6..0d2297383c4fcc1bb3efde306f33dcc4d9b4ac4b 100644 (file)
@@ -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);
index 3ee64fc9b54e87b874997900aef0b60dc93c5164..9ec485b62bf5ca95060b15603a9426f540a1c458 100644 (file)
@@ -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()
index 48bb5f5c7e6b0a785ffced378449348df53fc056..63ec9abf372de920976ea8fd2a6208149633c3db 100644 (file)
@@ -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);
index 24106c4351bc24cc9535c9019cf76293ddd6f897..209904dea1000d2fdbecb1c9393b65389f74051c 100644 (file)
@@ -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()
index b2e0504538ae38b2ce6d8f062e949935680f0adc..d1ea82f830ce3befd51ecfe624b5642bd57bc3c0 100644 (file)
@@ -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;
index 4c983d1a62ebbfcfb0e3cfc145077f4f33a532b4..3b10ff1abf00ec658695deb4ca4ac51f9fac8237 100644 (file)
@@ -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 ();
 }
index bc0615a7a92a6ff574e66eb6aff3ad70035f7001..d5868bddd6f554cf19606d5dfa7019a65927fabd 100644 (file)
@@ -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);
        };
index 7e2a1d892ad79397ad36f5412d543083700cd9c4..33115432e6b449484e40687d8a6f1cf35dcdcc79 100644 (file)
@@ -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());
        }
 }
 
index 0732873f5cc705eacebf6d2a7b99d0605ead9c99..e14a16d180d9edd95461e06309df6ba288e14c8e 100644 (file)
@@ -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());
                }
        }
                
index 615294b6ac95b5f0abce5b1234323bc6f30c54e1..400063c2b677ec03f96b13429ea78f4eb8aabbbf 100644 (file)
@@ -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 ();
 }
index c4c75ea6d757a943a31e3225f41be213e855e4e0..4a5bce4674ce5c945c1fb2f5ee5f4b80af09a74c 100644 (file)
@@ -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();
                        }
 
index bbb5d338652b4282ffb482e08a5358390959b458..637d902ff7f5cb59acd09ccab7339b0a3023add7 100644 (file)
@@ -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;
index dcb6d68e0c71f6ed0b98837f528d625d4e4ca856..c4ad44da37e700ebdb217d06ba25c01a44bd98cd 100644 (file)
@@ -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__ */
index cdfeceaa8d56634d059eee8ad9ea46b53756e557..770057687a05d4fc69e08cb3e02ebc42257d5639 100644 (file)
@@ -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));
 
index fe1593a4aa941dd51c130e407387c969a52f088d..67e05dc47acae901f422adfe0424f1055fea20fe 100644 (file)
@@ -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)));
 }
 
index 0f6735c9eaea37d3bc9e8c8f73266731eb619973..8c9e87074c518f7549d1d289cc86d969f9cf45a5 100644 (file)
@@ -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__ */
index cf37c2dad45a9cd429cb3fe49155eaf2b72b1af4..bfa209d81e6c750c10ac777fefdea32be7813707 100644 (file)
@@ -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);
index a1a9323134fbc2448a62392b4e68262ff67ccbe7..c09d3c65cd4ea2b8aa794b8b612ce34fe7b4e75d 100644 (file)
@@ -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 {
index 2f4a31a3e0d8903e7f0a28b5d75d365c14b15f74..4e934b0a3c7008fa8a17ad635e2df4357a5874cc 100644 (file)
@@ -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();
        }
 }
index 442fb959c42de85fd9847f4d6b90af91647961f1..0e5088cd265ac4b838a73f9a9491469c1ccf2869 100644 (file)
@@ -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)
index 3eb72a9b535eae35505524d14917ed49f113913e..d84cc8ba3605e99049a787fe03b20c31ab206863 100644 (file)
@@ -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
index 05cd154831b0a318c32be1b08be735d2d2f3cd55..edba77140d1fc6c057799911a5ac6826c2b57ec4 100644 (file)
@@ -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();
index 4c1bb9fec348204d19588bb291767fe7cb35bbc2..0b245876519b8f0e2c0a308ee967afbcb1a35998 100644 (file)
@@ -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),
index 2c71466518a762698c4b359d1874093a39c1b0cb..171b9137026b20ab12aa307252ec7834e665ecea 100644 (file)
@@ -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__ */
index 5b6b8a71b40db4da7878954d2f43338ac977aa1f..675a3b060326cd086b5f45b74780762410165820 100644 (file)
@@ -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();
 }
index 2cc6e253ba69b639f64cd4139379ee7424825e39..2fb6328c1c80267177f45f54acbd9e69cb434e11 100644 (file)
@@ -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);
index 6489efcdf79efc26e3073287a66f2b126c479fe7..910e996702f92ea3da08ce0e806ed29ebd36c46d 100644 (file)
@@ -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
index 39f98582c77976954bc7527a76a041680fdc0b57..a29ad7b4ccc3fb2a2d0efa074a32f9ca5a214e55 100644 (file)
@@ -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
index effb9431d0fc9c762553ed471f697342322faa61..d28dc371330c0d333d8838dec152876b36d4065d 100644 (file)
@@ -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;
index ab1297d6bcbebe619974e7ea78b430aa33af25a9..3592668cf85fc856da637bd9b678b6e6985875cb 100644 (file)
 #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 ();
index f79abb8eb9254457cfdb59b0581055626f22102c..927764e57c439796f67c2e3244943d7036c072a9 100644 (file)
@@ -66,5 +66,5 @@ private:
        int _wave_width;
        int _wave_height;
 
-       boost::signals2::scoped_connection _peaks_ready_connection;
+       PBD::ScopedConnection _peaks_ready_connection;
 };
index 6fd2570c2783ee4fe53fcfe5a7c7a77d0c7cf285..31baf17234a6d47c266c3267b7da6d5100e9c361 100644 (file)
@@ -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());
        }
 
 }
index d3e3e880037226081a92be97b9c3f9b0589bacfc..cac49687a3166c6592f244fc61d5e2fbc195418f 100644 (file)
@@ -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());
        }
 }
 
index 4f4645190795cd1513d2bd78d66afca373fa122e..45f62fc7b96fa048446c669f1cd7210cb7c190fa 100644 (file)
@@ -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;
index c21182f4e2238e3b65e650ea3197afa24b607b95..819b70df434117aff3235a2dd742b2e4febe31b3 100644 (file)
@@ -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;
 };
 
 }
index 66c8720186e5b08fb578365b3c24bed0ddb81db2..2ce2d5225ad4fde75fba90fef8bda7212fe36999 100644 (file)
@@ -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;
index f60d16391f3e6ced7fbf02f86f1c39d014c9a012..f8dc553ae0631fe3b67d9e7750551db3660b13e3 100644 (file)
@@ -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);
 
index 85c3ffe1b2909511e411aebf656a5d2b2663e588..3379868d608999ea43150c9a55e04d9525d36e45 100644 (file)
@@ -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);
                }
 
index 19b5bd7be594a8543e43b74508ef1085b649d8ee..502c3a72201bea4992600fbd97e8c86871b9d62f 100644 (file)
@@ -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 ();
        }
index cce7869072ead4be929361e35408c390f751bbc5..24febdd86a3fe3be9162905d729bf039383f2627 100644 (file)
@@ -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
index 5fcabb0c774127b45607cbca6c852841cf9777a9..0c820eed4d29b9c923fb0a14150b2c978b52b305 100644 (file)
@@ -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;
index 1e28ebc8b4c88bf2e51ac587cc0e5b7d9ac23d60..82ec91cafd160f63a78fc533663f7b4cf26c59bc 100644 (file)
@@ -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);
index 1438f937226ef923e852892c34a79fd0dc7f37b7..902dbc97057e2ecb4196f5ae5ad7699ac9340cd4 100644 (file)
@@ -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));
        }
 }
 
index 8af85a553c05ceb85a5c26b14e01b6c07834c311..a37323de84e8faf64a0c77b04465c75653e1a159 100644 (file)
@@ -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
index dfe038734b60bbe77ebc9505b2092e39c3aa9ddf..80e672038e089dfe2a325776abe699ba56b91a0a 100644 (file)
@@ -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);
index d25877c5bcea7e91966d0e244be90755546c7a77..51c1771ae748b21137d3adb96148a327a4175126 100644 (file)
@@ -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);
 }
 
index a7dd544d47391f4e63dede355a3ec7f9b37e6114..eb9be6183bd7bd4a249f291bf8ada3d0dd7dd828 100644 (file)
@@ -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
index a85e41d40a64482380dac699aba1e427267bb83f..b78fc20f7ef1bcbf5340d278ffd2730c6fdd521b 100644 (file)
@@ -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 */
index f42d3c4e805c33a0fe056324624e870f8367c350..279472e02d18cda39eef14d6236aed6f56303eeb 100644 (file)
@@ -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
index 8e9010b1481d9158268e085aa91e3c2e69426752..368eff2be40542af7128ca1208bcddec32cadb0f 100644 (file)
@@ -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 ();
                }
index f47e147a18b4ea991a28f6163c525864d01cf358..9066acac9167be385766ae8a0e50cca2c919c94b 100644 (file)
@@ -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
index 7303059207b420cbb263b5f722ffd902a31482f8..3a43580d648c79fe028311fae3c884268799aa9d 100644 (file)
@@ -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
index 2320bd4be447f4c97b37f402a86bcdaee143d72f..17c14043588d2eb58b5ea778872a52549555d9c5 100644 (file)
@@ -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);
 
index b477dbb2f9aeaa265955a1196372df242c740a2e..7bb995337f64bbf7225773e28bd1350b9c8a144f 100644 (file)
@@ -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);
 }
index a6c64c3c307b6b64be88d16e823f22e23aeab36a..2fe0616973064941b233fbe13ed0984919aebe17 100644 (file)
@@ -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 ();
        }
index 38f856b5a2494b105dee3243d0c61076dacabe07..70be1f345d075c05ec63e1f579c17f2f70db0a1d 100644 (file)
@@ -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
index 91ac47c883cbd676ddd53b8dd69527001515ea49..c713925475a26eda9391044a494b37a93e2d7c37 100644 (file)
@@ -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
index 985cd6740a35cc46036a6e0642d85d5bae9b6e49..e638a7a6b0261d75ec2409b5021de24f42ccd855 100644 (file)
@@ -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;
 }
index 731a7c04ddfb06545a03bfa19da785fa8700e8a5..d706421c39382689ce8b2c86f449eccdc985e6cd 100644 (file)
@@ -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)));
                }
        }
 }
index eeb8ae83c17b28b77134f2033756591cf6c87898..c652023e2cc4978daec1ce30e19bf9da921c306c 100644 (file)
@@ -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);
index 1da2eda67820fedd99bdd9a2f2e50945eab82944..2f946dd62067499c9c12eb31812ef7566551e4a8 100644 (file)
@@ -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 */
index 8d707545fe71d8efa63e47b160496dc723da489b..a062efee8dfb796e973440ceafdb6ad1c385b6be 100644 (file)
@@ -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();
 }
 
index 1bd0c2e7c7865ff41103852e67484cdafa307541..840c752badcb3e4ba8228edbc29c446fcd77b902 100644 (file)
@@ -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);
        }
 
index f1f6147960c088d26c25dfb722e2648646abea23..1cd78c8aac0d821b181d366123bcdef44b95682b 100644 (file)
@@ -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
index bd06fe78eebcf56742d4b36e5604e97aa8d179f2..d8859e07c03ca0106201fd258acb946ebaad0b30 100644 (file)
@@ -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);
 
index 0d32ea75d74f0e07681af1806b3b9858a927e321..238bd724045a0934cee36740fc086febff954d92 100644 (file)
@@ -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;
index 7bb27db808865835b50df0c84b2a61dfa8640e38..5def97941f7eefa856f86fbd4cb403368d3364b0 100644 (file)
@@ -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);
index bcd074a516ef09f6cbc1b9eaa320044b6b65a026..22486634788a6e91c923ae0e4f7d5375eb40f09a 100644 (file)
@@ -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();
index 6805e5f6dde292da47648a4474e4a2c4f9d02649..185cb15e79ea89dbc82c28325a846b428c5b709f 100644 (file)
@@ -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
index f35f84e88999139d9152202e7fca2d22ed0f5d2e..2ef5abe5d57529a04de697f3a0145e1ddc130337 100644 (file)
@@ -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();
         }
 }
index 08d215036dac63933d34e25ce503a6bd427750b4..f12c64cf68973a0bf39a626ee5167abdb2c60a8a 100644 (file)
@@ -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;
        }
index 3d86c6d103d8dc12e2f201fa2f8856a03c02b6b9..38512d70f5d69a7b14c11c1d9c8ed8dc7a4ff753 100644 (file)
@@ -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 */
 
index bf71b0579c617760f61174f1f7c129984803e727..2760e8ae5182576d1d41a25ceada837d74e7e574 100644 (file)
@@ -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
index 986ff5f0e078dd9b7da614077e8fc399bdab9533..673037cc5d3198f52262a792e9b162d7f555853e 100644 (file)
@@ -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;
index eb1c6cb5b044a05eac3794afd3dcaf775ad67b2c..603023010870ef618c2704d694a66713eb59517e 100644 (file)
@@ -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;
index 2efa77ae0b21b3fb70254135c286e196e4e73cde..af9cfafaca9876d114cd4de98cd8de8c4c62f49e 100644 (file)
@@ -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;
index ea7e469c74964ce16ab3ea2ee71f252cdf1768db..5e856d1ca082bff15ee4491005e067cf691af44e 100644 (file)
@@ -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 ();
 }
index dd0dfd4445d4402deb6c6a78fb1eb33d1f4d3d9b..d751c3c80b365582122c4fb4cb4eb238ec946813 100644 (file)
@@ -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 (file)
index 0000000..3bc4abc
--- /dev/null
@@ -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); 
+}
+
index 2bfaa11be0faaedbffa2cd02c96296c174c6e10e..9e88be60f20ba1b89c85a4b783a6052139a15d1c 100644 (file)
@@ -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/event_loop.h b/libs/pbd/pbd/event_loop.h
new file mode 100644 (file)
index 0000000..be98fcd
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+    Copyright (C) 2009 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_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 */
+#include <glibmm/thread.h>
+
+namespace PBD
+{
+
+class EventLoop 
+{
+  public:
+       EventLoop() {}
+       virtual ~EventLoop() {}
+
+       virtual void call_slot (const boost::function<void()>&) = 0;
+
+       static EventLoop* get_event_loop_for_thread();
+       static void set_event_loop_for_thread (EventLoop* ui);
+
+  private:
+       static Glib::StaticPrivate<EventLoop> thread_event_loop;
+
+};
+
+}
+
+#endif /* __pbd_event_loop_h__ */
index b87f784334a87f1d6aee38e005989c9717efbf8d..a08d3bb717287463834303ad814c818fbfa99260 100644 (file)
@@ -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 (file)
index 90adad6..0000000
+++ /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__ */
index 47e8d143bc55f69e2781767a8079aad93f89d633..0b44ee80515b1464471cab567fb90d527a97516d 100644 (file)
 
 #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/pbd/ui_callback.h b/libs/pbd/pbd/ui_callback.h
deleted file mode 100644 (file)
index 8574de0..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-    Copyright (C) 2009 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_ui_callback_h__
-#define __pbd_ui_callback_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 */
-#include <glibmm/thread.h>
-
-namespace PBD
-{
-
-class UICallback 
-{
-  public:
-       UICallback() {}
-       virtual ~UICallback() {}
-
-       virtual void call_slot (const boost::function<void()>&) = 0;
-
-       static UICallback* get_ui_for_thread();
-       static void set_ui_for_thread (UICallback* ui);
-
-  private:
-       static Glib::StaticPrivate<UICallback> thread_ui;
-
-};
-
-}
-
-#endif /* __pbd_ui_callback_h__ */
diff --git a/libs/pbd/ui_callback.cc b/libs/pbd/ui_callback.cc
deleted file mode 100644 (file)
index 9a8feb3..0000000
+++ /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); 
-}
-
index 1a2574ae28ab915abb68564ba617f7eb1a39877a..81e31f3a88402febfa9e19d2463753088015a21b 100644 (file)
@@ -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
index d7e456ada756514b0f02d2d527eb09e091abeb26..b25d8059ceb8d013e8cf3840a8eed1e596da6ab8 100644 (file)
@@ -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
index d7f9d52efd184206c38e65ba19a103cc3652c27f..ff6de6b274ee9d8251e91b7e002afd7eb4f624ec 100644 (file)
@@ -18,6 +18,8 @@
 
 */
 
+#include "pbd/error.h"
+
 #include "ardour/session.h"
 #include "ardour/route.h"
 #include "ardour/audio_track.h"
 
 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();
 }
index c80ba9b4b67fb46c0b87864b0ac3d11a0daf2cd9..b3d44a15aad49a2630cefe6c0d1ea333ffe74e47 100644 (file)
@@ -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);
index e9f12638b65ad819cde187af6440590e794b4fc0..c3d7aabfaf82b34d32c0904fba7d6fe26ff9de57 100644 (file)
@@ -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;
                        }
                }
        }
index c42d796e8111be81c76fbafbfe8b989dfe1f5fbc..39958bcf26de96258adc94f440a1650922124e99 100644 (file)
@@ -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 */
index a1f5abf3b0e1028a1eeac1597c14fef8cabfa14d..d6b400719412a4a602f6573e603b9bd8dcf650bb 100644 (file)
 
 #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;
index 9f4ffb10c066f2cfdb1031ecb526a5ff08a3bb17..48d074e1177582aae3b833d6f56eafbcd8983990 100644 (file)
@@ -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());
        }
 }
 
index 069ad9abb43095fad0839f28b7312ebb0bcf5909..476e6acb8196506de3b2282cc09aa09f575dc3fd 100644 (file)
@@ -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));
        }
 }
 
index 9a3dd41bf4ce29fa2bec337c1d1d0b8dad955290..6dc8532db914e7b59c712ed670dff979f7a8800e 100644 (file)
@@ -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
index a076b161e71022d1ca432e3fb1aacd0577ef7be7..6054d01334dbb8472fd8d104146dc14a007ce3c4 100644 (file)
@@ -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);
        }
 }
 
index 15914bfbbd09c2d0ee24590d5926f4d03c05cef8..0c72671ae90fbdc934aa0ed3955d1d697cac65ff 100644 (file)
@@ -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
index f5deadd41db25874777caf366b51ad62288a69ac..baf888667e70539bdaabac004d3cc3b77d5f440c 100644 (file)
@@ -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 ()
index 67b828446001d09238cdbda47dbfba96e69a9f6b..55e2815d35c7ce3dd49db9a0f4c8f7c2a73a56d6 100644 (file)
@@ -30,9 +30,7 @@
 #include "ardour/types.h"
 
 namespace ARDOUR {
-
-class Route;
-
+       class Route;
 }
 
 class OSCControllable : public PBD::Stateful
index 31154ad879aef80216e0bcd92ba2e5aa0fbb6f2e..a3b535c9e0276b4204825095d22a5055c5733ac8 100644 (file)
@@ -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 */)
 {
 }