Ports say when they're going away.
authorCarl Hetherington <carl@carlh.net>
Fri, 2 Jan 2009 19:38:43 +0000 (19:38 +0000)
committerCarl Hetherington <carl@carlh.net>
Fri, 2 Jan 2009 19:38:43 +0000 (19:38 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@4380 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/port.h
libs/ardour/port.cc

index ad81d6763fbc656b2af0024cb8bbe82588407c1f..6bd607c334dc11d3b96b207216c38d5836097d81 100644 (file)
@@ -26,6 +26,7 @@
 #include <cstring>
 #include <sigc++/signal.h>
 #include <pbd/failed_constructor.h>
+#include <pbd/destructible.h>
 #include <ardour/ardour.h>
 #include <ardour/data_type.h>
 #include <jack/jack.h>
@@ -37,7 +38,7 @@ class Buffer;
 
 /** Abstract base for ports
  */
-class Port : public virtual sigc::trackable {
+class Port : public virtual PBD::Destructible {
    public:
        enum Flags {
                IsInput = JackPortIsInput,
@@ -132,6 +133,10 @@ class Port : public virtual sigc::trackable {
        std::set<Port*> _connections;
 
        static AudioEngine* engine;
+
+   private:
+
+        void port_going_away (Port *);
 };
 
 class PortConnectableByName {
index 7aadb9183f878817ebaa115fc39977a0c6970573..f3e0739e83031e57d32edf904b7f003f233058fa 100644 (file)
@@ -34,6 +34,7 @@ Port::Port (const std::string& name, Flags flgs)
 
 Port::~Port ()
 {
+       drop_references ();
        disconnect_all ();
 }
 
@@ -59,6 +60,7 @@ Port::connect (Port& other)
        result = _connections.insert (&other);
 
        if (result.second) {
+               other.GoingAway.connect (sigc::bind (mem_fun (*this, &Port::port_going_away), &other));
                return 0;
        } else {
                return 1;
@@ -131,6 +133,14 @@ Port::get_connections (vector<string>& names) const
        return i;
 }
 
+void
+Port::port_going_away (Port* p)
+{
+       /* caller must hold process lock */
+
+       disconnect (*p);
+}
+
 
 //-------------------------------------
 
@@ -377,3 +387,4 @@ PortFacade::reset ()
                _ext_port->reset ();
        }
 }
+