summaryrefslogtreecommitdiff
path: root/libs/backends/dummy
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2020-04-07 10:18:16 -0600
committerPaul Davis <paul@linuxaudiosystems.com>2020-04-07 13:23:49 -0600
commitb9cb306e8b9a330ec5211ccdfde6b90f17701099 (patch)
tree4e3e2d90fe9d0747a06e08c8bfd099fc275c07b4 /libs/backends/dummy
parent1eb98316a3467c94842f6b6ba21eaf4470760880 (diff)
use shared_ptr to manage backend port lifetimes (Pulse,ALSA,Dummy,JACK)
JACK is not yet finished. Changes also include minor reformatting and a spelling correction (latecies to latencies)
Diffstat (limited to 'libs/backends/dummy')
-rw-r--r--libs/backends/dummy/dummy_audiobackend.cc133
-rw-r--r--libs/backends/dummy/dummy_audiobackend.h6
2 files changed, 66 insertions, 73 deletions
diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc
index bf87b3275c..ba51944fb5 100644
--- a/libs/backends/dummy/dummy_audiobackend.cc
+++ b/libs/backends/dummy/dummy_audiobackend.cc
@@ -263,18 +263,18 @@ DummyAudioBackend::set_buffer_size (uint32_t bs)
*/
LatencyRange lr;
lr.min = lr.max = _systemic_input_latency;
- for (std::vector<BackendPort*>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it) {
+ for (std::vector<BackendPortPtr>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it) {
set_latency_range (*it, false, lr);
}
- for (std::vector<BackendPort*>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it) {
+ for (std::vector<BackendPortPtr>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it) {
set_latency_range (*it, false, lr);
}
lr.min = lr.max = _systemic_output_latency;
- for (std::vector<BackendPort*>::const_iterator it = _system_outputs.begin (); it != _system_outputs.end (); ++it) {
+ for (std::vector<BackendPortPtr>::const_iterator it = _system_outputs.begin (); it != _system_outputs.end (); ++it) {
set_latency_range (*it, true, lr);
}
- for (std::vector<BackendPort*>::const_iterator it = _system_midi_out.begin (); it != _system_midi_out.end (); ++it) {
+ for (std::vector<BackendPortPtr>::const_iterator it = _system_midi_out.begin (); it != _system_midi_out.end (); ++it) {
set_latency_range (*it, true, lr);
}
@@ -689,13 +689,18 @@ DummyAudioBackend::register_system_ports()
for (int i = 1; i <= a_ins; ++i) {
char tmp[64];
snprintf(tmp, sizeof(tmp), "system:capture_%d", i);
- PortHandle p = add_port(std::string(tmp), DataType::AUDIO, static_cast<PortFlags>(IsOutput | IsPhysical | IsTerminal));
+ PortPtr p = add_port(std::string(tmp), DataType::AUDIO, static_cast<PortFlags>(IsOutput | IsPhysical | IsTerminal));
if (!p) return -1;
set_latency_range (p, false, lr);
- _system_inputs.push_back (static_cast<DummyAudioPort*>(p));
- std::string name = static_cast<DummyAudioPort*>(p)->setup_generator (gt, _samplerate, i - 1, a_ins);
+
+ boost::shared_ptr<DummyAudioPort> dp = boost::dynamic_pointer_cast<DummyAudioPort>(p);
+
+ _system_inputs.push_back (dp);
+
+ std::string name = dp->setup_generator (gt, _samplerate, i - 1, a_ins);
+
if (!name.empty ()) {
- static_cast<DummyAudioPort*>(p)->set_pretty_name (name);
+ dp->set_pretty_name (name);
}
}
@@ -703,10 +708,10 @@ DummyAudioBackend::register_system_ports()
for (int i = 1; i <= a_out; ++i) {
char tmp[64];
snprintf(tmp, sizeof(tmp), "system:playback_%d", i);
- PortHandle p = add_port(std::string(tmp), DataType::AUDIO, static_cast<PortFlags>(IsInput | IsPhysical | IsTerminal));
+ PortPtr p = add_port(std::string(tmp), DataType::AUDIO, static_cast<PortFlags>(IsInput | IsPhysical | IsTerminal));
if (!p) return -1;
set_latency_range (p, true, lr);
- _system_outputs.push_back (static_cast<DummyAudioPort*>(p));
+ _system_outputs.push_back (boost::dynamic_pointer_cast<BackendPort>(p));
}
/* midi ports */
@@ -714,20 +719,24 @@ DummyAudioBackend::register_system_ports()
for (int i = 0; i < m_ins; ++i) {
char tmp[64];
snprintf(tmp, sizeof(tmp), "system:midi_capture_dummy_%d", i+1);
- PortHandle p = add_port(std::string(tmp), DataType::MIDI, static_cast<PortFlags>(IsOutput | IsPhysical | IsTerminal));
+ PortPtr p = add_port(std::string(tmp), DataType::MIDI, static_cast<PortFlags>(IsOutput | IsPhysical | IsTerminal));
if (!p) return -1;
set_latency_range (p, false, lr);
- _system_midi_in.push_back (static_cast<DummyMidiPort*>(p));
+
+ boost::shared_ptr<DummyMidiPort> dp = boost::dynamic_pointer_cast<DummyMidiPort>(p);
+
+ _system_midi_in.push_back (dp);
+
if (_midi_mode == MidiGenerator) {
- std::string name = static_cast<DummyMidiPort*>(p)->setup_generator (i % NUM_MIDI_EVENT_GENERATORS, _samplerate);
+ std::string name = dp->setup_generator (i % NUM_MIDI_EVENT_GENERATORS, _samplerate);
if (!name.empty ()) {
- static_cast<DummyMidiPort*>(p)->set_pretty_name (name);
+ dp->set_pretty_name (name);
}
}
else if (_midi_mode == MidiOneHz) {
- std::string name = static_cast<DummyMidiPort*>(p)->setup_generator (-1, _samplerate);
+ std::string name = dp->setup_generator (-1, _samplerate);
if (!name.empty ()) {
- static_cast<DummyMidiPort*>(p)->set_pretty_name (name);
+ dp->set_pretty_name (name);
}
}
}
@@ -739,7 +748,9 @@ DummyAudioBackend::register_system_ports()
PortHandle p = add_port(std::string(tmp), DataType::MIDI, static_cast<PortFlags>(IsInput | IsPhysical | IsTerminal));
if (!p) return -1;
set_latency_range (p, true, lr);
- _system_midi_out.push_back (static_cast<DummyMidiPort*>(p));
+
+ boost::shared_ptr<DummyMidiPort> dp = boost::dynamic_pointer_cast<DummyMidiPort>(p);
+ _system_midi_out.push_back (dp);
if (_device == _("Loopback") && _midi_mode == MidiToAudio) {
std::stringstream ss;
@@ -749,30 +760,12 @@ DummyAudioBackend::register_system_ports()
ss << " >" << (apc + 1);
}
}
- static_cast<DummyMidiPort*>(p)->set_pretty_name (ss.str());
+ dp->set_pretty_name (ss.str());
}
}
return 0;
}
-void
-DummyAudioBackend::update_system_port_latecies ()
-{
- for (std::vector<BackendPort*>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it) {
- (*it)->update_connected_latency (true);
- }
- for (std::vector<BackendPort*>::const_iterator it = _system_outputs.begin (); it != _system_outputs.end (); ++it) {
- (*it)->update_connected_latency (false);
- }
-
- for (std::vector<BackendPort*>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it) {
- (*it)->update_connected_latency (true);
- }
- for (std::vector<BackendPort*>::const_iterator it = _system_midi_out.begin (); it != _system_midi_out.end (); ++it) {
- (*it)->update_connected_latency (false);
- }
-}
-
BackendPort*
DummyAudioBackend::port_factory (std::string const & name, ARDOUR::DataType type, ARDOUR::PortFlags flags)
{
@@ -881,35 +874,35 @@ DummyAudioBackend::monitoring_input (PortEngine::PortHandle)
/* Latency management */
void
-DummyAudioBackend::set_latency_range (PortEngine::PortHandle port, bool for_playback, LatencyRange latency_range)
+DummyAudioBackend::set_latency_range (PortEngine::PortHandle port_handle, bool for_playback, LatencyRange latency_range)
{
+ BackendPortPtr port = boost::dynamic_pointer_cast<BackendPort> (port_handle);
if (!valid_port (port)) {
PBD::error << _("DummyPort::set_latency_range (): invalid port.") << endmsg;
}
- static_cast<DummyPort*>(port)->set_latency_range (latency_range, for_playback);
+ port->set_latency_range (latency_range, for_playback);
}
LatencyRange
-DummyAudioBackend::get_latency_range (PortEngine::PortHandle port, bool for_playback)
+DummyAudioBackend::get_latency_range (PortEngine::PortHandle port_handle, bool for_playback)
{
LatencyRange r;
+ BackendPortPtr port = boost::dynamic_pointer_cast<BackendPort> (port_handle);
if (!valid_port (port)) {
PBD::error << _("DummyPort::get_latency_range (): invalid port.") << endmsg;
r.min = 0;
r.max = 0;
return r;
}
- DummyPort *p = static_cast<DummyPort*>(port);
- assert(p);
- r = p->latency_range (for_playback);
- if (p->is_physical() && p->is_terminal()) {
- if (p->is_input() && for_playback) {
+ r = port->latency_range (for_playback);
+ if (port->is_physical() && port->is_terminal()) {
+ if (port->is_input() && for_playback) {
const size_t l_in = _samples_per_period * .25;
r.min += l_in;
r.max += l_in;
}
- if (p->is_output() && !for_playback) {
+ if (port->is_output() && !for_playback) {
/* with 'Loopback' there is exactly once cycle latency, divide it between In + Out; */
const size_t l_in = _samples_per_period * .25;
const size_t l_out = _samples_per_period - l_in;
@@ -923,11 +916,12 @@ DummyAudioBackend::get_latency_range (PortEngine::PortHandle port, bool for_play
/* Getting access to the data buffer for a port */
void*
-DummyAudioBackend::get_buffer (PortEngine::PortHandle port, pframes_t nframes)
+DummyAudioBackend::get_buffer (PortEngine::PortHandle port_handle, pframes_t nframes)
{
+ BackendPortPtr port = boost::dynamic_pointer_cast<BackendPort> (port_handle);
assert (port);
assert (valid_port (port));
- return static_cast<DummyPort*>(port)->get_buffer (nframes);
+ return port->get_buffer (nframes);
}
/* Engine Process */
@@ -952,11 +946,11 @@ DummyAudioBackend::main_process_thread ()
}
// re-set input buffers, generate on demand.
- for (std::vector<BackendPort*>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it) {
- static_cast<DummyPort*>(*it)->next_period();
+ for (std::vector<BackendPortPtr>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it) {
+ boost::dynamic_pointer_cast<DummyPort>(*it)->next_period ();
}
- for (std::vector<BackendPort*>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it) {
- static_cast<DummyPort*>(*it)->next_period();
+ for (std::vector<BackendPortPtr>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it) {
+ boost::dynamic_pointer_cast<DummyPort>(*it)->next_period ();
}
if (engine.process_callback (samples_per_period)) {
@@ -967,28 +961,28 @@ DummyAudioBackend::main_process_thread ()
if (_device == _("Loopback") && _midi_mode != MidiToAudio) {
int opn = 0;
int opc = _system_outputs.size();
- for (std::vector<BackendPort*>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it, ++opn) {
- DummyAudioPort* op = static_cast<DummyAudioPort*> (_system_outputs[(opn % opc)]);
- static_cast<DummyAudioPort*>(*it)->fill_wavetable ((const float*)op->get_buffer (samples_per_period), samples_per_period);
+ for (std::vector<BackendPortPtr>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it, ++opn) {
+ BackendPortPtr op = _system_outputs[(opn % opc)];
+ boost::dynamic_pointer_cast<DummyAudioPort>(*it)->fill_wavetable ((const float*)op->get_buffer (samples_per_period), samples_per_period);
}
}
if (_midi_mode == MidiLoopback) {
int opn = 0;
int opc = _system_midi_out.size();
- for (std::vector<BackendPort*>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it, ++opn) {
- DummyMidiPort* op = static_cast<DummyMidiPort*> (_system_midi_out[(opn % opc)]);
+ for (std::vector<BackendPortPtr>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it, ++opn) {
+ boost::shared_ptr<DummyMidiPort> op = boost::dynamic_pointer_cast<DummyMidiPort> (_system_midi_out[(opn % opc)]);
op->get_buffer(0); // mix-down
- static_cast<DummyMidiPort*>(*it)->set_loopback (op->const_buffer());
+ boost::dynamic_pointer_cast<DummyMidiPort>(*it)->set_loopback (op->const_buffer());
}
}
else if (_midi_mode == MidiToAudio) {
int opn = 0;
int opc = _system_midi_out.size();
- for (std::vector<BackendPort*>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it, ++opn) {
- DummyMidiPort* op = static_cast<DummyMidiPort*> (_system_midi_out[(opn % opc)]);
+ for (std::vector<BackendPortPtr>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it, ++opn) {
+ boost::shared_ptr<DummyMidiPort> op = boost::dynamic_pointer_cast<DummyMidiPort> (_system_midi_out[(opn % opc)]);
op->get_buffer(0); // mix-down
- static_cast<DummyAudioPort*>(*it)->midi_to_wavetable (op->const_buffer(), samples_per_period);
+ boost::dynamic_pointer_cast<DummyAudioPort>(*it)->midi_to_wavetable (op->const_buffer(), samples_per_period);
}
}
@@ -1039,7 +1033,7 @@ DummyAudioBackend::main_process_thread ()
manager.graph_order_callback();
}
if (connections_changed || ports_changed) {
- update_system_port_latecies ();
+ update_system_port_latencies ();
engine.latency_callback(false);
engine.latency_callback(true);
}
@@ -1622,22 +1616,23 @@ void DummyAudioPort::generate (const pframes_t n_samples)
_gen_cycle = true;
}
-void* DummyAudioPort::get_buffer (pframes_t n_samples)
+void*
+DummyAudioPort::get_buffer (pframes_t n_samples)
{
if (is_input ()) {
- const std::set<BackendPort *>& connections = get_connections ();
- std::set<BackendPort*>::const_iterator it = connections.begin ();
+ const std::set<BackendPortPtr>& connections = get_connections ();
+ std::set<BackendPortPtr>::const_iterator it = connections.begin ();
if (it == connections.end ()) {
memset (_buffer, 0, n_samples * sizeof (Sample));
} else {
- DummyAudioPort * source = static_cast<DummyAudioPort*>(*it);
+ boost::shared_ptr<DummyAudioPort> source = boost::dynamic_pointer_cast<DummyAudioPort>(*it);
assert (source && source->is_output ());
if (source->is_physical() && source->is_terminal()) {
source->get_buffer(n_samples); // generate signal.
}
memcpy (_buffer, source->const_buffer (), n_samples * sizeof (Sample));
while (++it != connections.end ()) {
- source = static_cast<DummyAudioPort*>(*it);
+ source = boost::dynamic_pointer_cast<DummyAudioPort>(*it);
assert (source && source->is_output ());
Sample* dst = buffer ();
if (source->is_physical() && source->is_terminal()) {
@@ -1761,11 +1756,11 @@ void* DummyMidiPort::get_buffer (pframes_t n_samples)
{
if (is_input ()) {
_buffer.clear ();
- const std::set<BackendPort*>& connections = get_connections ();
- for (std::set<BackendPort*>::const_iterator i = connections.begin ();
+ const std::set<BackendPortPtr>& connections = get_connections ();
+ for (std::set<BackendPortPtr>::const_iterator i = connections.begin ();
i != connections.end ();
++i) {
- DummyMidiPort * source = static_cast<DummyMidiPort*>(*i);
+ boost::shared_ptr<DummyMidiPort> source = boost::dynamic_pointer_cast<DummyMidiPort>(*i);
if (source->is_physical() && source->is_terminal()) {
source->get_buffer(n_samples); // generate signal.
}
diff --git a/libs/backends/dummy/dummy_audiobackend.h b/libs/backends/dummy/dummy_audiobackend.h
index 843debcccf..58c0bc593d 100644
--- a/libs/backends/dummy/dummy_audiobackend.h
+++ b/libs/backends/dummy/dummy_audiobackend.h
@@ -297,12 +297,12 @@ class DummyAudioBackend : public AudioBackend, public PortEngineSharedImpl {
int set_port_name (PortEngine::PortHandle ph, const std::string& name) { return PortEngineSharedImpl::set_port_name (ph, name); }
std::string get_port_name (PortEngine::PortHandle ph) const { return PortEngineSharedImpl::get_port_name (ph); }
PortFlags get_port_flags (PortEngine::PortHandle ph) const { return PortEngineSharedImpl::get_port_flags (ph); }
- PortEngine::PortHandle get_port_by_name (std::string const & name) const { return PortEngineSharedImpl::get_port_by_name (name); }
+ PortEngine::PortPtr get_port_by_name (std::string const & name) const { return PortEngineSharedImpl::get_port_by_name (name); }
int get_port_property (PortEngine::PortHandle ph, const std::string& key, std::string& value, std::string& type) const { return PortEngineSharedImpl::get_port_property (ph, key, value, type); }
int set_port_property (PortEngine::PortHandle ph, const std::string& key, const std::string& value, const std::string& type) { return PortEngineSharedImpl::set_port_property (ph, key, value, type); }
int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>& results) const { return PortEngineSharedImpl::get_ports (port_name_pattern, type, flags, results); }
DataType port_data_type (PortEngine::PortHandle ph) const { return PortEngineSharedImpl::port_data_type (ph); }
- PortEngine::PortHandle register_port (const std::string& shortname, ARDOUR::DataType type, ARDOUR::PortFlags flags) { return PortEngineSharedImpl::register_port (shortname, type, flags); }
+ PortEngine::PortPtr register_port (const std::string& shortname, ARDOUR::DataType type, ARDOUR::PortFlags flags) { return PortEngineSharedImpl::register_port (shortname, type, flags); }
void unregister_port (PortHandle ph) { if (!_running) return; PortEngineSharedImpl::unregister_port (ph); }
int connect (const std::string& src, const std::string& dst) { return PortEngineSharedImpl::connect (src, dst); }
int disconnect (const std::string& src, const std::string& dst) { return PortEngineSharedImpl::disconnect (src, dst); }
@@ -403,8 +403,6 @@ class DummyAudioBackend : public AudioBackend, public PortEngineSharedImpl {
/* port engine */
int register_system_ports ();
- void update_system_port_latecies ();
-
struct PortConnectData {
std::string a;