use RCU to manage JACK backend's container of ports
This commit is contained in:
parent
feff57d29a
commit
70f13a3ff3
@ -64,6 +64,7 @@ JACKAudioBackend::JACKAudioBackend (AudioEngine& e, AudioBackendInfo& info, boos
|
|||||||
, _target_systemic_output_latency (0)
|
, _target_systemic_output_latency (0)
|
||||||
, _current_sample_rate (0)
|
, _current_sample_rate (0)
|
||||||
, _current_buffer_size (0)
|
, _current_buffer_size (0)
|
||||||
|
, _jack_ports (new JackPorts)
|
||||||
, _session (0)
|
, _session (0)
|
||||||
{
|
{
|
||||||
_jack_connection->Connected.connect_same_thread (jack_connection_connection, boost::bind (&JACKAudioBackend::when_connected_to_jack, this));
|
_jack_connection->Connected.connect_same_thread (jack_connection_connection, boost::bind (&JACKAudioBackend::when_connected_to_jack, this));
|
||||||
@ -72,7 +73,13 @@ JACKAudioBackend::JACKAudioBackend (AudioEngine& e, AudioBackendInfo& info, boos
|
|||||||
|
|
||||||
JACKAudioBackend::~JACKAudioBackend()
|
JACKAudioBackend::~JACKAudioBackend()
|
||||||
{
|
{
|
||||||
_jack_ports.clear ();
|
{
|
||||||
|
RCUWriter<JackPorts> writer (_jack_ports);
|
||||||
|
boost::shared_ptr<JackPorts> jp = writer.get_copy ();
|
||||||
|
jp->clear ();
|
||||||
|
}
|
||||||
|
|
||||||
|
_jack_ports.flush ();
|
||||||
}
|
}
|
||||||
|
|
||||||
string
|
string
|
||||||
|
@ -302,8 +302,8 @@ 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;
|
typedef std::map<void*,boost::shared_ptr<JackPort> > JackPorts;
|
||||||
mutable JackPorts _jack_ports; /* can be modified in ::get_port_by_name () */
|
mutable SerializedRCUManager<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);
|
||||||
|
|
||||||
|
@ -182,16 +182,24 @@ JACKAudioBackend::get_port_by_name (const std::string& name) const
|
|||||||
return PortEngine::PortPtr();
|
return PortEngine::PortPtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if we have a shared_ptr<JackPort> for this already */
|
boost::shared_ptr<JackPorts> ports = _jack_ports.reader ();
|
||||||
|
|
||||||
JackPorts::const_iterator i = _jack_ports.find (jack_port);
|
JackPorts::const_iterator i = ports->find (jack_port);
|
||||||
|
|
||||||
if (i != _jack_ports.end()) {
|
if (i != ports->end()) {
|
||||||
return i->second;
|
return i->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<JackPort> jp (new JackPort (jack_port));
|
boost::shared_ptr<JackPort> jp;
|
||||||
_jack_ports.insert (std::make_pair (jack_port, jp));
|
|
||||||
|
{
|
||||||
|
RCUWriter<JackPorts> writer (_jack_ports);
|
||||||
|
boost::shared_ptr<JackPorts> ports = writer.get_copy();
|
||||||
|
jp.reset (new JackPort (jack_port));
|
||||||
|
ports->insert (std::make_pair (jack_port, jp));
|
||||||
|
}
|
||||||
|
|
||||||
|
_jack_ports.flush ();
|
||||||
|
|
||||||
return jp;
|
return jp;
|
||||||
}
|
}
|
||||||
@ -505,9 +513,18 @@ JACKAudioBackend::register_port (const std::string& shortname, ARDOUR::DataType
|
|||||||
return PortEngine::PortPtr();
|
return PortEngine::PortPtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<JackPort> jp (new JackPort (jack_port));
|
boost::shared_ptr<JackPort> jp;
|
||||||
|
|
||||||
_jack_ports.insert (std::make_pair (jack_port, jp));
|
{
|
||||||
|
RCUWriter<JackPorts> writer (_jack_ports);
|
||||||
|
boost::shared_ptr<JackPorts> ports = writer.get_copy();
|
||||||
|
|
||||||
|
jp.reset (new JackPort (jack_port));
|
||||||
|
|
||||||
|
ports->insert (std::make_pair (jack_port, jp));
|
||||||
|
}
|
||||||
|
|
||||||
|
_jack_ports.flush();
|
||||||
|
|
||||||
return jp;
|
return jp;
|
||||||
}
|
}
|
||||||
@ -517,7 +534,16 @@ JACKAudioBackend::unregister_port (PortHandle port)
|
|||||||
{
|
{
|
||||||
GET_PRIVATE_JACK_POINTER (_priv_jack);
|
GET_PRIVATE_JACK_POINTER (_priv_jack);
|
||||||
boost::shared_ptr<JackPort> jp = boost::dynamic_pointer_cast<JackPort>(port);
|
boost::shared_ptr<JackPort> jp = boost::dynamic_pointer_cast<JackPort>(port);
|
||||||
_jack_ports.erase (jp->jack_ptr);
|
|
||||||
|
{
|
||||||
|
RCUWriter<JackPorts> writer (_jack_ports);
|
||||||
|
boost::shared_ptr<JackPorts> ports = writer.get_copy();
|
||||||
|
|
||||||
|
ports->erase (jp->jack_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
_jack_ports.flush ();
|
||||||
|
|
||||||
(void) jack_port_unregister (_priv_jack, jp->jack_ptr);
|
(void) jack_port_unregister (_priv_jack, jp->jack_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user