mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-11 09:06:33 +01:00
fix up shared_ptr<> use in JACK backend
This commit is contained in:
parent
b9cb306e8b
commit
d827f3fdae
3 changed files with 39 additions and 9 deletions
|
|
@ -41,6 +41,7 @@ BackendPort::BackendPort (PortEngineSharedImpl &b, const std::string& name, Port
|
||||||
BackendPort::~BackendPort ()
|
BackendPort::~BackendPort ()
|
||||||
{
|
{
|
||||||
assert (_connections.empty());
|
assert (_connections.empty());
|
||||||
|
std::cerr << "Backendport @ " << this << " being deleted\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,8 @@
|
||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
|
#include "pbd/stacktrace.h"
|
||||||
|
|
||||||
#include "weak_libjack.h"
|
#include "weak_libjack.h"
|
||||||
|
|
||||||
#include "ardour/audio_backend.h"
|
#include "ardour/audio_backend.h"
|
||||||
|
|
@ -43,6 +45,7 @@ class JackPort : public ProtoPort
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
JackPort (jack_port_t* p) : jack_ptr (p) {}
|
JackPort (jack_port_t* p) : jack_ptr (p) {}
|
||||||
|
~JackPort() { }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class JACKAudioBackend;
|
friend class JACKAudioBackend;
|
||||||
|
|
@ -299,6 +302,9 @@ class JACKAudioBackend : public AudioBackend {
|
||||||
static void _registration_callback (jack_port_id_t, int, void *);
|
static void _registration_callback (jack_port_id_t, int, void *);
|
||||||
static void _connect_callback (jack_port_id_t, 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);
|
void connect_callback (jack_port_id_t, jack_port_id_t, int);
|
||||||
|
|
||||||
ChanCount n_physical (unsigned long flags) const;
|
ChanCount n_physical (unsigned long flags) const;
|
||||||
|
|
|
||||||
|
|
@ -173,10 +173,27 @@ JACKAudioBackend::set_port_property (PortHandle port, const std::string& key, co
|
||||||
}
|
}
|
||||||
|
|
||||||
PortEngine::PortPtr
|
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);
|
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
|
void
|
||||||
|
|
@ -480,22 +497,28 @@ PortEngine::PortPtr
|
||||||
JACKAudioBackend::register_port (const std::string& shortname, ARDOUR::DataType type, ARDOUR::PortFlags flags)
|
JACKAudioBackend::register_port (const std::string& shortname, ARDOUR::DataType type, ARDOUR::PortFlags flags)
|
||||||
{
|
{
|
||||||
GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
|
GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
|
||||||
jack_port_t* p = jack_port_register (_priv_jack, shortname.c_str(),
|
jack_port_t* jack_port = jack_port_register (_priv_jack, shortname.c_str(),
|
||||||
ardour_data_type_to_jack_port_type (type),
|
ardour_data_type_to_jack_port_type (type),
|
||||||
ardour_port_flags_to_jack_flags (flags),
|
ardour_port_flags_to_jack_flags (flags),
|
||||||
0);
|
0);
|
||||||
if (!p) {
|
if (!jack_port) {
|
||||||
return PortEngine::PortPtr();
|
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
|
void
|
||||||
JACKAudioBackend::unregister_port (PortHandle port)
|
JACKAudioBackend::unregister_port (PortHandle port)
|
||||||
{
|
{
|
||||||
GET_PRIVATE_JACK_POINTER (_priv_jack);
|
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
|
int
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue