mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-17 12:16:30 +01:00
Use RCU for MIDI Manager's port list.
git-svn-id: svn://localhost/ardour2/branches/3.0@10128 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
e5a9ea3ed9
commit
d6112f1213
5 changed files with 39 additions and 20 deletions
|
|
@ -117,8 +117,8 @@ MidiTracer::ports_changed ()
|
||||||
string const c = _port_combo.get_active_text ();
|
string const c = _port_combo.get_active_text ();
|
||||||
_port_combo.clear ();
|
_port_combo.clear ();
|
||||||
|
|
||||||
Manager::PortList const & p = Manager::instance()->get_midi_ports ();
|
boost::shared_ptr<const Manager::PortList> p = Manager::instance()->get_midi_ports ();
|
||||||
for (Manager::PortList::const_iterator i = p.begin(); i != p.end(); ++i) {
|
for (Manager::PortList::const_iterator i = p->begin(); i != p->end(); ++i) {
|
||||||
_port_combo.append_text ((*i)->name());
|
_port_combo.append_text ((*i)->name());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -130,9 +130,9 @@ MidiControlUI::reset_ports ()
|
||||||
{
|
{
|
||||||
clear_ports ();
|
clear_ports ();
|
||||||
|
|
||||||
MIDI::Manager::PortList plist = MIDI::Manager::instance()->get_midi_ports ();
|
boost::shared_ptr<const MIDI::Manager::PortList> plist = MIDI::Manager::instance()->get_midi_ports ();
|
||||||
|
|
||||||
for (MIDI::Manager::PortList::iterator i = plist.begin(); i != plist.end(); ++i) {
|
for (MIDI::Manager::PortList::const_iterator i = plist->begin(); i != plist->end(); ++i) {
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
if ((fd = (*i)->selectable ()) >= 0) {
|
if ((fd = (*i)->selectable ()) >= 0) {
|
||||||
|
|
|
||||||
|
|
@ -212,9 +212,9 @@ RCConfiguration::get_state ()
|
||||||
MIDI::Manager* mm = MIDI::Manager::instance();
|
MIDI::Manager* mm = MIDI::Manager::instance();
|
||||||
|
|
||||||
if (mm) {
|
if (mm) {
|
||||||
const MIDI::Manager::PortList& ports = mm->get_midi_ports();
|
boost::shared_ptr<const MIDI::Manager::PortList> ports = mm->get_midi_ports();
|
||||||
|
|
||||||
for (MIDI::Manager::PortList::const_iterator i = ports.begin(); i != ports.end(); ++i) {
|
for (MIDI::Manager::PortList::const_iterator i = ports->begin(); i != ports->end(); ++i) {
|
||||||
root->add_child_nocopy((*i)->get_state());
|
root->add_child_nocopy((*i)->get_state());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,8 @@ using namespace PBD;
|
||||||
|
|
||||||
Manager *Manager::theManager = 0;
|
Manager *Manager::theManager = 0;
|
||||||
|
|
||||||
Manager::Manager (jack_client_t* jack)
|
Manager::Manager (jack_client_t* jack)
|
||||||
|
: _ports (new PortList)
|
||||||
{
|
{
|
||||||
_mmc = new MachineControl (this, jack);
|
_mmc = new MachineControl (this, jack);
|
||||||
|
|
||||||
|
|
@ -52,7 +53,9 @@ Manager::~Manager ()
|
||||||
delete _mmc;
|
delete _mmc;
|
||||||
|
|
||||||
/* This will delete our MTC etc. ports */
|
/* This will delete our MTC etc. ports */
|
||||||
for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) {
|
|
||||||
|
boost::shared_ptr<PortList> pr = _ports.reader ();
|
||||||
|
for (PortList::iterator p = pr->begin(); p != pr->end(); ++p) {
|
||||||
delete *p;
|
delete *p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -64,7 +67,9 @@ Manager::~Manager ()
|
||||||
Port *
|
Port *
|
||||||
Manager::add_port (Port* p)
|
Manager::add_port (Port* p)
|
||||||
{
|
{
|
||||||
_ports.push_back (p);
|
RCUWriter<PortList> writer (_ports);
|
||||||
|
boost::shared_ptr<PortList> pw = writer.get_copy ();
|
||||||
|
pw->push_back (p);
|
||||||
|
|
||||||
PortsChanged (); /* EMIT SIGNAL */
|
PortsChanged (); /* EMIT SIGNAL */
|
||||||
|
|
||||||
|
|
@ -74,7 +79,9 @@ Manager::add_port (Port* p)
|
||||||
void
|
void
|
||||||
Manager::cycle_start (pframes_t nframes)
|
Manager::cycle_start (pframes_t nframes)
|
||||||
{
|
{
|
||||||
for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) {
|
boost::shared_ptr<PortList> pr = _ports.reader ();
|
||||||
|
|
||||||
|
for (PortList::iterator p = pr->begin(); p != pr->end(); ++p) {
|
||||||
(*p)->cycle_start (nframes);
|
(*p)->cycle_start (nframes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -82,7 +89,9 @@ Manager::cycle_start (pframes_t nframes)
|
||||||
void
|
void
|
||||||
Manager::cycle_end()
|
Manager::cycle_end()
|
||||||
{
|
{
|
||||||
for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) {
|
boost::shared_ptr<PortList> pr = _ports.reader ();
|
||||||
|
|
||||||
|
for (PortList::iterator p = pr->begin(); p != pr->end(); ++p) {
|
||||||
(*p)->cycle_end ();
|
(*p)->cycle_end ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -91,7 +100,9 @@ Manager::cycle_end()
|
||||||
void
|
void
|
||||||
Manager::reestablish (jack_client_t* jack)
|
Manager::reestablish (jack_client_t* jack)
|
||||||
{
|
{
|
||||||
for (PortList::const_iterator p = _ports.begin(); p != _ports.end(); ++p) {
|
boost::shared_ptr<PortList> pr = _ports.reader ();
|
||||||
|
|
||||||
|
for (PortList::const_iterator p = pr->begin(); p != pr->end(); ++p) {
|
||||||
(*p)->reestablish (jack);
|
(*p)->reestablish (jack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -100,7 +111,9 @@ Manager::reestablish (jack_client_t* jack)
|
||||||
void
|
void
|
||||||
Manager::reconnect ()
|
Manager::reconnect ()
|
||||||
{
|
{
|
||||||
for (PortList::const_iterator p = _ports.begin(); p != _ports.end(); ++p) {
|
boost::shared_ptr<PortList> pr = _ports.reader ();
|
||||||
|
|
||||||
|
for (PortList::const_iterator p = pr->begin(); p != pr->end(); ++p) {
|
||||||
(*p)->reconnect ();
|
(*p)->reconnect ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -108,12 +121,14 @@ Manager::reconnect ()
|
||||||
Port*
|
Port*
|
||||||
Manager::port (string const & n)
|
Manager::port (string const & n)
|
||||||
{
|
{
|
||||||
PortList::const_iterator p = _ports.begin();
|
boost::shared_ptr<PortList> pr = _ports.reader ();
|
||||||
while (p != _ports.end() && (*p)->name() != n) {
|
|
||||||
|
PortList::const_iterator p = pr->begin();
|
||||||
|
while (p != pr->end() && (*p)->name() != n) {
|
||||||
++p;
|
++p;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p == _ports.end()) {
|
if (p == pr->end()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -130,8 +145,10 @@ Manager::create (jack_client_t* jack)
|
||||||
void
|
void
|
||||||
Manager::set_port_states (list<XMLNode*> s)
|
Manager::set_port_states (list<XMLNode*> s)
|
||||||
{
|
{
|
||||||
|
boost::shared_ptr<PortList> pr = _ports.reader ();
|
||||||
|
|
||||||
for (list<XMLNode*>::iterator i = s.begin(); i != s.end(); ++i) {
|
for (list<XMLNode*>::iterator i = s.begin(); i != s.end(); ++i) {
|
||||||
for (PortList::const_iterator j = _ports.begin(); j != _ports.end(); ++j) {
|
for (PortList::const_iterator j = pr->begin(); j != pr->end(); ++j) {
|
||||||
(*j)->set_state (**i);
|
(*j)->set_state (**i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "pbd/rcu.h"
|
||||||
|
|
||||||
#include "midi++/types.h"
|
#include "midi++/types.h"
|
||||||
#include "midi++/port.h"
|
#include "midi++/port.h"
|
||||||
|
|
||||||
|
|
@ -64,7 +66,7 @@ class Manager {
|
||||||
|
|
||||||
typedef std::list<Port *> PortList;
|
typedef std::list<Port *> PortList;
|
||||||
|
|
||||||
const PortList& get_midi_ports() const { return _ports; }
|
boost::shared_ptr<const PortList> get_midi_ports() const { return _ports.reader (); }
|
||||||
|
|
||||||
static void create (jack_client_t* jack);
|
static void create (jack_client_t* jack);
|
||||||
|
|
||||||
|
|
@ -90,8 +92,8 @@ class Manager {
|
||||||
MIDI::Port* _midi_output_port;
|
MIDI::Port* _midi_output_port;
|
||||||
MIDI::Port* _midi_clock_input_port;
|
MIDI::Port* _midi_clock_input_port;
|
||||||
MIDI::Port* _midi_clock_output_port;
|
MIDI::Port* _midi_clock_output_port;
|
||||||
|
|
||||||
std::list<Port*> _ports;
|
SerializedRCUManager<PortList> _ports;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace MIDI
|
} // namespace MIDI
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue