summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-06-06 13:53:07 +0200
committerRobin Gareus <robin@gareus.org>2014-06-07 17:28:46 +0200
commit960a5347f0ee41305c3fabc45424e562b132b350 (patch)
tree299b558656bcf9fa9667a4776fca38b93317294c
parent5288de3dc0467efd9f073bac62bbb8a50558f6c8 (diff)
ALSA & Dummy: implement port [un]registration_callback
-rw-r--r--libs/backends/alsa/alsa_audiobackend.cc18
-rw-r--r--libs/backends/alsa/alsa_audiobackend.h7
-rw-r--r--libs/backends/dummy/dummy_audiobackend.cc21
-rw-r--r--libs/backends/dummy/dummy_audiobackend.h7
4 files changed, 52 insertions, 1 deletions
diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc
index fcbf8871cc..6ef07e208d 100644
--- a/libs/backends/alsa/alsa_audiobackend.cc
+++ b/libs/backends/alsa/alsa_audiobackend.cc
@@ -57,6 +57,7 @@ AlsaAudioBackend::AlsaAudioBackend (AudioEngine& e, AudioBackendInfo& info)
, _systemic_input_latency (0)
, _systemic_output_latency (0)
, _processed_samples (0)
+ , _port_change_flag (false)
{
_instance_name = s_instance_name;
pthread_mutex_init (&_port_callback_mutex, 0);
@@ -487,6 +488,7 @@ AlsaAudioBackend::_start (bool for_latency_measurement)
engine.reconnect_ports ();
_run = true;
+ _port_change_flag = false;
if (_realtime_pthread_create (SCHED_FIFO, -20,
&_main_thread, pthread_process, this))
@@ -1286,6 +1288,7 @@ AlsaAudioBackend::main_process_thread ()
_pcmi->pcm_start ();
int no_proc_errors = 0;
+ manager.registration_callback();
manager.graph_order_callback();
while (_run) {
@@ -1396,7 +1399,16 @@ AlsaAudioBackend::main_process_thread ()
Glib::usleep (100); // don't hog cpu
}
+ bool connections_changed = false;
+ bool ports_changed = false;
if (!pthread_mutex_trylock (&_port_callback_mutex)) {
+ if (_port_change_flag) {
+ ports_changed = true;
+ _port_change_flag = false;
+ }
+ if (!_port_connection_queue.empty ()) {
+ connections_changed = true;
+ }
while (!_port_connection_queue.empty ()) {
PortConnectData *c = _port_connection_queue.back ();
manager.connect_callback (c->a, c->b, c->c);
@@ -1405,6 +1417,12 @@ AlsaAudioBackend::main_process_thread ()
}
pthread_mutex_unlock (&_port_callback_mutex);
}
+ if (ports_changed) {
+ manager.registration_callback();
+ }
+ if (connections_changed) {
+ manager.graph_order_callback();
+ }
}
_pcmi->pcm_stop ();
diff --git a/libs/backends/alsa/alsa_audiobackend.h b/libs/backends/alsa/alsa_audiobackend.h
index 386a83a33f..55a6b0086e 100644
--- a/libs/backends/alsa/alsa_audiobackend.h
+++ b/libs/backends/alsa/alsa_audiobackend.h
@@ -352,6 +352,7 @@ class AlsaAudioBackend : public AudioBackend {
std::vector<PortConnectData *> _port_connection_queue;
pthread_mutex_t _port_callback_mutex;
+ bool _port_change_flag;
void port_connect_callback (const std::string& a, const std::string& b, bool conn) {
pthread_mutex_lock (&_port_callback_mutex);
@@ -359,6 +360,12 @@ class AlsaAudioBackend : public AudioBackend {
pthread_mutex_unlock (&_port_callback_mutex);
}
+ void port_connect_add_remove_callback () {
+ pthread_mutex_lock (&_port_callback_mutex);
+ _port_change_flag = true;
+ pthread_mutex_unlock (&_port_callback_mutex);
+ }
+
bool valid_port (PortHandle port) const {
return std::find (_ports.begin (), _ports.end (), (AlsaPort*)port) != _ports.end ();
}
diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc
index 04ef7168e8..ba8e98cad8 100644
--- a/libs/backends/dummy/dummy_audiobackend.cc
+++ b/libs/backends/dummy/dummy_audiobackend.cc
@@ -47,6 +47,7 @@ DummyAudioBackend::DummyAudioBackend (AudioEngine& e, AudioBackendInfo& info)
, _systemic_input_latency (0)
, _systemic_output_latency (0)
, _processed_samples (0)
+ , _port_change_flag (false)
{
_instance_name = s_instance_name;
pthread_mutex_init (&_port_callback_mutex, 0);
@@ -321,6 +322,7 @@ DummyAudioBackend::_start (bool /*for_latency_measurement*/)
}
engine.reconnect_ports ();
+ _port_change_flag = false;
if (pthread_create (&_main_thread, NULL, pthread_process, this)) {
PBD::error << _("DummyAudioBackend: cannot start.") << endmsg;
@@ -671,7 +673,6 @@ DummyAudioBackend::register_system_ports()
if (!p) return -1;
set_latency_range (p, true, lr);
}
-
return 0;
}
@@ -1006,6 +1007,7 @@ DummyAudioBackend::main_process_thread ()
_running = true;
_processed_samples = 0;
+ manager.registration_callback();
manager.graph_order_callback();
uint64_t clock1, clock2;
@@ -1031,7 +1033,16 @@ DummyAudioBackend::main_process_thread ()
}
clock1 = g_get_monotonic_time();
+ bool connections_changed = false;
+ bool ports_changed = false;
if (!pthread_mutex_trylock (&_port_callback_mutex)) {
+ if (_port_change_flag) {
+ ports_changed = true;
+ _port_change_flag = false;
+ }
+ if (!_port_connection_queue.empty ()) {
+ connections_changed = true;
+ }
while (!_port_connection_queue.empty ()) {
PortConnectData *c = _port_connection_queue.back ();
manager.connect_callback (c->a, c->b, c->c);
@@ -1040,6 +1051,12 @@ DummyAudioBackend::main_process_thread ()
}
pthread_mutex_unlock (&_port_callback_mutex);
}
+ if (ports_changed) {
+ manager.registration_callback();
+ }
+ if (connections_changed) {
+ manager.graph_order_callback();
+ }
}
_running = false;
@@ -1109,10 +1126,12 @@ DummyPort::DummyPort (DummyAudioBackend &b, const std::string& name, PortFlags f
_capture_latency_range.max = 0;
_playback_latency_range.min = 0;
_playback_latency_range.max = 0;
+ _dummy_backend.port_connect_add_remove_callback();
}
DummyPort::~DummyPort () {
disconnect_all ();
+ _dummy_backend.port_connect_add_remove_callback();
}
diff --git a/libs/backends/dummy/dummy_audiobackend.h b/libs/backends/dummy/dummy_audiobackend.h
index 733bb5f78a..b8069ee429 100644
--- a/libs/backends/dummy/dummy_audiobackend.h
+++ b/libs/backends/dummy/dummy_audiobackend.h
@@ -328,6 +328,7 @@ class DummyAudioBackend : public AudioBackend {
std::vector<PortConnectData *> _port_connection_queue;
pthread_mutex_t _port_callback_mutex;
+ bool _port_change_flag;
void port_connect_callback (const std::string& a, const std::string& b, bool conn) {
pthread_mutex_lock (&_port_callback_mutex);
@@ -335,6 +336,12 @@ class DummyAudioBackend : public AudioBackend {
pthread_mutex_unlock (&_port_callback_mutex);
}
+ void port_connect_add_remove_callback () {
+ pthread_mutex_lock (&_port_callback_mutex);
+ _port_change_flag = true;
+ pthread_mutex_unlock (&_port_callback_mutex);
+ }
+
bool valid_port (PortHandle port) const {
return std::find (_ports.begin (), _ports.end (), (DummyPort*)port) != _ports.end ();
}