diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2015-12-28 10:14:17 -0500 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2015-12-28 10:14:17 -0500 |
commit | 0d9efc11484c901795ff4e9549a1a39715d0474d (patch) | |
tree | 956ab3cd570670bcb1ff68856553f5aec4a8e470 /libs/surfaces/faderport | |
parent | db4834027858b10f313c822c7fb3fad1617f11aa (diff) |
redesign cross-thread registration/signalling system
This new design will work even when threads that need to receive
messages from RT threads are created *after* the RT threads. The
existing design would fail because the RT thread(s) would never
be known the later created threads, and so signals emitted by the
RT thread and causing call_slot() in the receiver would end up
being enqueued using a lock-protected list. The new design ensures
that communication always uses a lock-free FIFO instead
Diffstat (limited to 'libs/surfaces/faderport')
-rw-r--r-- | libs/surfaces/faderport/faderport.cc | 19 | ||||
-rw-r--r-- | libs/surfaces/faderport/faderport.h | 3 | ||||
-rw-r--r-- | libs/surfaces/faderport/faderport_interface.cc | 9 |
3 files changed, 25 insertions, 6 deletions
diff --git a/libs/surfaces/faderport/faderport.cc b/libs/surfaces/faderport/faderport.cc index 135943d34f..f10f70dce5 100644 --- a/libs/surfaces/faderport/faderport.cc +++ b/libs/surfaces/faderport/faderport.cc @@ -66,7 +66,7 @@ using namespace std; FaderPort::FaderPort (Session& s) : ControlProtocol (s, _("Faderport")) - , AbstractUI<FaderPortRequest> ("faderport") + , AbstractUI<FaderPortRequest> (name()) , gui (0) , connection_state (ConnectionState (0)) , _device_active (false) @@ -210,6 +210,17 @@ FaderPort::~FaderPort () tear_down_gui (); } +void* +FaderPort::request_factory (uint32_t num_requests) +{ + /* AbstractUI<T>::request_buffer_factory() is a template method only + instantiated in this source module. To provide something visible for + use in the interface/descriptor, we have this static method that is + template-free. + */ + return request_buffer_factory (num_requests); +} + void FaderPort::start_midi_handling () { @@ -267,10 +278,10 @@ FaderPort::thread_init () { struct sched_param rtparam; - pthread_set_name (X_("FaderPort")); + pthread_set_name (event_loop_name().c_str()); - PBD::notify_gui_about_thread_creation (X_("gui"), pthread_self(), X_("FaderPort"), 2048); - ARDOUR::SessionEvent::create_per_thread_pool (X_("FaderPort"), 128); + PBD::notify_event_loops_about_thread_creation (pthread_self(), event_loop_name(), 2048); + ARDOUR::SessionEvent::create_per_thread_pool (event_loop_name(), 128); memset (&rtparam, 0, sizeof (rtparam)); rtparam.sched_priority = 9; /* XXX should be relative to audio (JACK) thread */ diff --git a/libs/surfaces/faderport/faderport.h b/libs/surfaces/faderport/faderport.h index 6643e22369..025cf09e00 100644 --- a/libs/surfaces/faderport/faderport.h +++ b/libs/surfaces/faderport/faderport.h @@ -85,6 +85,7 @@ class FaderPort : public ARDOUR::ControlProtocol, public AbstractUI<FaderPortReq there's no way to know if the device exists or not. */ static bool probe() { return true; } + static void* request_factory (uint32_t); XMLNode& get_state (); int set_state (const XMLNode&, int version); @@ -160,7 +161,7 @@ class FaderPort : public ARDOUR::ControlProtocol, public AbstractUI<FaderPortReq std::string get_action (ButtonID, bool on_press, FaderPort::ButtonState = ButtonState (0)); std::list<boost::shared_ptr<ARDOUR::Bundle> > bundles (); - + private: boost::shared_ptr<ARDOUR::Route> _current_route; boost::weak_ptr<ARDOUR::Route> pre_master_route; diff --git a/libs/surfaces/faderport/faderport_interface.cc b/libs/surfaces/faderport/faderport_interface.cc index dcfebff190..e7ea5af396 100644 --- a/libs/surfaces/faderport/faderport_interface.cc +++ b/libs/surfaces/faderport/faderport_interface.cc @@ -56,6 +56,12 @@ probe_faderport_midi_protocol (ControlProtocolDescriptor* /*descriptor*/) return FaderPort::probe (); } +static void* +faderport_request_buffer_factory (uint32_t num_requests) +{ + return FaderPort::request_factory (num_requests); +} + static ControlProtocolDescriptor faderport_midi_descriptor = { /*name : */ "Faderport", /*id : */ "uri://ardour.org/surfaces/faderport:0", @@ -65,7 +71,8 @@ static ControlProtocolDescriptor faderport_midi_descriptor = { /*supports_feedback : */ true, /*probe : */ probe_faderport_midi_protocol, /*initialize : */ new_faderport_midi_protocol, - /*destroy : */ delete_faderport_midi_protocol + /*destroy : */ delete_faderport_midi_protocol, + /*request_buffer_factory */ faderport_request_buffer_factory }; extern "C" ARDOURSURFACE_API ControlProtocolDescriptor* protocol_descriptor () { return &faderport_midi_descriptor; } |