PBD::Signal1<void,bool> MonitorInputChanged;
static PBD::Signal2<void,boost::shared_ptr<Port>,boost::shared_ptr<Port> > PostDisconnect;
static PBD::Signal0<void> PortDrop;
+ static PBD::Signal0<void> PortSignalDrop;
static void set_cycle_framecnt (pframes_t n) {
_cycle_nframes = n;
std::set<std::string> _connections;
void port_connected_or_disconnected (boost::weak_ptr<Port>, boost::weak_ptr<Port>, bool);
+ void signal_drop ();
void drop ();
PBD::ScopedConnection drop_connection;
PBD::ScopedConnection engine_connection;
PBD::Signal2<void,boost::shared_ptr<Port>, boost::shared_ptr<Port> > Port::PostDisconnect;
PBD::Signal0<void> Port::PortDrop;
+PBD::Signal0<void> Port::PortSignalDrop;
bool Port::_connecting_blocked = false;
pframes_t Port::_global_port_buffer_offset = 0;
}
PortDrop.connect_same_thread (drop_connection, boost::bind (&Port::drop, this));
+ PortSignalDrop.connect_same_thread (drop_connection, boost::bind (&Port::signal_drop, this));
port_manager->PortConnectedOrDisconnected.connect_same_thread (engine_connection,
boost::bind (&Port::port_connected_or_disconnected, this, _1, _3, _5));
}
return false;
}
+void
+Port::signal_drop ()
+{
+ engine_connection.disconnect ();
+}
+
void
Port::drop ()
{
_state_of_the_state = StateOfTheState (CannotSave|Deletion);
+ /* stop autoconnecting */
+ auto_connect_thread_terminate ();
+
/* disconnect from any and all signals that we are connected to */
drop_connections ();
* callbacks from the engine any more.
*/
+ Port::PortSignalDrop (); /* EMIT SIGNAL */
Port::PortDrop (); /* EMIT SIGNAL */
ltc_tx_cleanup();
pthread_cond_destroy (&_rt_emit_cond);
pthread_mutex_destroy (&_rt_emit_mutex);
- auto_connect_thread_terminate ();
-
pthread_cond_destroy (&_auto_connect_cond);
pthread_mutex_destroy (&_auto_connect_mutex);
if (_ac_thread_active) {
return;
}
- _ac_thread_active = true;
- // clear queue
+
while (!_auto_connect_queue.empty ()) {
_auto_connect_queue.pop ();
}
+ _ac_thread_active = true;
if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) {
_ac_thread_active = false;
}
}
_ac_thread_active = false;
+ {
+ Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
+ while (!_auto_connect_queue.empty ()) {
+ _auto_connect_queue.pop ();
+ }
+ }
+
if (pthread_mutex_lock (&_auto_connect_mutex) == 0) {
pthread_cond_signal (&_auto_connect_cond);
pthread_mutex_unlock (&_auto_connect_mutex);