summaryrefslogtreecommitdiff
path: root/libs/backends
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2020-04-07 13:06:49 -0600
committerPaul Davis <paul@linuxaudiosystems.com>2020-04-07 13:23:49 -0600
commitd827f3fdae5ee516cd72586c0e0c1d5d01deaaf4 (patch)
tree0abc1e9d92c49f55a061a2b9a070c22cc891f443 /libs/backends
parentb9cb306e8b9a330ec5211ccdfde6b90f17701099 (diff)
fix up shared_ptr<> use in JACK backend
Diffstat (limited to 'libs/backends')
-rw-r--r--libs/backends/jack/jack_audiobackend.h6
-rw-r--r--libs/backends/jack/jack_portengine.cc41
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