diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2020-04-07 13:06:49 -0600 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2020-04-07 13:23:49 -0600 |
commit | d827f3fdae5ee516cd72586c0e0c1d5d01deaaf4 (patch) | |
tree | 0abc1e9d92c49f55a061a2b9a070c22cc891f443 /libs/backends | |
parent | b9cb306e8b9a330ec5211ccdfde6b90f17701099 (diff) |
fix up shared_ptr<> use in JACK backend
Diffstat (limited to 'libs/backends')
-rw-r--r-- | libs/backends/jack/jack_audiobackend.h | 6 | ||||
-rw-r--r-- | libs/backends/jack/jack_portengine.cc | 41 |
2 files changed, 38 insertions, 9 deletions
diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index 11c41f4c46..1cde158025 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -30,6 +30,8 @@ #include <boost/shared_ptr.hpp> +#include "pbd/stacktrace.h" + #include "weak_libjack.h" #include "ardour/audio_backend.h" @@ -43,6 +45,7 @@ class JackPort : public ProtoPort { public: JackPort (jack_port_t* p) : jack_ptr (p) {} + ~JackPort() { } private: friend class JACKAudioBackend; @@ -299,6 +302,9 @@ class JACKAudioBackend : public AudioBackend { static void _registration_callback (jack_port_id_t, int, void *); static void _connect_callback (jack_port_id_t, jack_port_id_t, int, void *); + typedef std::map<void*,boost::shared_ptr<JackPort> > JackPorts; + mutable JackPorts _jack_ports; /* can be modified in ::get_port_by_name () */ + void connect_callback (jack_port_id_t, jack_port_id_t, int); ChanCount n_physical (unsigned long flags) const; diff --git a/libs/backends/jack/jack_portengine.cc b/libs/backends/jack/jack_portengine.cc index 488d900da5..d52848760e 100644 --- a/libs/backends/jack/jack_portengine.cc +++ b/libs/backends/jack/jack_portengine.cc @@ -173,10 +173,27 @@ JACKAudioBackend::set_port_property (PortHandle port, const std::string& key, co } PortEngine::PortPtr -JACKAudioBackend:: get_port_by_name (const std::string& name) const +JACKAudioBackend::get_port_by_name (const std::string& name) const { GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0); - return boost::shared_ptr<ProtoPort> (new JackPort (jack_port_by_name (_priv_jack, name.c_str()))); + jack_port_t * jack_port = jack_port_by_name (_priv_jack, name.c_str()); + + if (!jack_port) { + return PortEngine::PortPtr(); + } + + /* check if we have a shared_ptr<JackPort> for this already */ + + JackPorts::const_iterator i = _jack_ports.find (jack_port); + + if (i != _jack_ports.end()) { + return i->second; + } + + boost::shared_ptr<JackPort> jp (new JackPort (jack_port)); + _jack_ports.insert (std::make_pair (jack_port, jp)); + + return jp; } void @@ -480,22 +497,28 @@ PortEngine::PortPtr JACKAudioBackend::register_port (const std::string& shortname, ARDOUR::DataType type, ARDOUR::PortFlags flags) { GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0); - jack_port_t* p = jack_port_register (_priv_jack, shortname.c_str(), - ardour_data_type_to_jack_port_type (type), - ardour_port_flags_to_jack_flags (flags), - 0); - if (!p) { + jack_port_t* jack_port = jack_port_register (_priv_jack, shortname.c_str(), + ardour_data_type_to_jack_port_type (type), + ardour_port_flags_to_jack_flags (flags), + 0); + if (!jack_port) { return PortEngine::PortPtr(); } - return boost::shared_ptr<ProtoPort> (new JackPort (p)); + boost::shared_ptr<JackPort> jp (new JackPort (jack_port)); + + _jack_ports.insert (std::make_pair (jack_port, jp)); + + return jp; } void JACKAudioBackend::unregister_port (PortHandle port) { GET_PRIVATE_JACK_POINTER (_priv_jack); - (void) jack_port_unregister (_priv_jack, boost::dynamic_pointer_cast<JackPort>(port)->jack_ptr); + boost::shared_ptr<JackPort> jp = boost::dynamic_pointer_cast<JackPort>(port); + _jack_ports.erase (jp->jack_ptr); + (void) jack_port_unregister (_priv_jack, jp->jack_ptr); } int |