PPI: Implement Jack reset() capability
[senf.git] / PPI / Connectors.cc
index ab1a038..6c1dade 100644 (file)
 
 prefix_ void senf::ppi::connector::Connector::connect(Connector & target)
 {
-    SENF_ASSERT( module_ && ! peer_ && target.module_ && ! target.peer_ );
+    // The connector is not registered -> route() or noroute() statement missing
+    SENF_ASSERT( module_ && 
+                 "senf::ppi::connector::Connector::connect(): (source) "
+                 "Missing route() or noroute()" );
+    // The connector is already connected
+    SENF_ASSERT( ! peer_ &&
+                 "senf::ppi::connector::Connector::connect(): (source) "
+                 "duplicate connection" );
+    // The target connector is not registered -> route() or noroute() statement missing
+    SENF_ASSERT( target.module_ &&
+                 "senf::ppi::connector::Connector::connect(): (target) "
+                 "Missing route() or noroute()" );
+    // The target connector is already connected
+    SENF_ASSERT( ! target.peer_ &&
+                 "senf::ppi::connector::Connector::connect(): (target) "
+                 "duplicate connection" );
     if (! (packetTypeID() == typeid(void) ||
            target.packetTypeID() == typeid(void) || 
            packetTypeID() == target.packetTypeID()) )
@@ -53,8 +68,25 @@ prefix_ void senf::ppi::connector::Connector::connect(Connector & target)
     peer_ = & target;
     target.peer_ = this;
 
-    if (ModuleManager::instance().running())
-        v_init();
+    if (! initializationScheduled())
+        enqueueInitializable();
+    if (! peer().initializationScheduled())
+        peer().enqueueInitializable();
+}
+
+prefix_ void senf::ppi::connector::Connector::disconnect()
+{
+    // Cannot disconnected a non-connected connector
+    SENF_ASSERT( peer_ &&
+                 "senf::ppi::connector::Connector::disconnect(): Not connected" );
+    Connector & peer (*peer_);
+    peer_ = 0;
+    peer.peer_ = 0;
+
+    if (! initializationScheduled())
+        enqueueInitializable();
+    if (! peer.initializationScheduled())
+        peer.enqueueInitializable();
 }
 
 prefix_ std::type_info const & senf::ppi::connector::Connector::packetTypeID()
@@ -88,19 +120,12 @@ prefix_ void senf::ppi::connector::PassiveConnector::v_unthrottleEvent()
 
 prefix_ void senf::ppi::connector::PassiveConnector::notifyUnthrottle()
 {
-    if (throttled() && !nativeThrottled_) {
-        Routes::const_iterator i (routes_.begin());
-        Routes::const_iterator const i_end (routes_.end());
-        for (; i != i_end; ++i)
-            if ((*i)->throttled())
-                break;
-        if (i == i_end) {
-            remoteThrottled_ = false;
-            emitUnthrottle();
-        }
-    } 
-    else
+    if (std::find_if(routes_.begin(), routes_.end(), 
+                     boost::bind(&ForwardingRoute::throttled, _1)) == routes_.end()) {
         remoteThrottled_ = false;
+        if (!nativeThrottled_)
+            emitUnthrottle();
+    }
 }
 
 ///////////////////////////////////////////////////////////////////////////