summaryrefslogtreecommitdiff
path: root/libs/ardour/audioengine.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/audioengine.cc')
-rw-r--r--libs/ardour/audioengine.cc87
1 files changed, 26 insertions, 61 deletions
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc
index a0cf29eb89..87866e7b31 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -22,6 +22,7 @@
#include <cerrno>
#include <vector>
+#include <glibmm/timer.h>
#include <pbd/pthread_utils.h>
#include <ardour/audioengine.h>
@@ -45,7 +46,6 @@ jack_nframes_t Port::long_over_length = 10;
AudioEngine::AudioEngine (string client_name)
{
- pthread_cond_init (&session_removed, 0);
session = 0;
session_remove_pending = false;
_running = false;
@@ -60,10 +60,12 @@ AudioEngine::AudioEngine (string client_name)
_buffer_size = 0;
_freewheeling = false;
_freewheel_thread_registered = false;
- last_meter_point = 0;
- meter_interval = 0;
- meter_thread_id = (pthread_t) 0;
+
+ m_meter_thread = 0;
+ m_meter_exit = false;
+ start_metering_thread();
+
if (connect_to_jack (client_name)) {
throw NoBackendAvailable ();
}
@@ -76,9 +78,9 @@ AudioEngine::~AudioEngine ()
jack_client_close (_jack);
}
- if (meter_thread_id != (pthread_t) 0) {
- pthread_cancel (meter_thread_id);
- }
+ if(m_meter_thread) {
+ g_atomic_int_inc(&m_meter_exit);
+ }
}
void
@@ -212,7 +214,6 @@ AudioEngine::_graph_order_callback (void *arg)
return 0;
}
-/** @callgraph */
int
AudioEngine::_process_callback (jack_nframes_t nframes, void *arg)
{
@@ -225,11 +226,10 @@ AudioEngine::_freewheel_callback (int onoff, void *arg)
static_cast<AudioEngine*>(arg)->_freewheeling = onoff;
}
-/** @callgraph */
int
AudioEngine::process_callback (jack_nframes_t nframes)
{
- TentativeLockMonitor tm (_process_lock, __LINE__, __FILE__);
+ Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
jack_nframes_t next_processed_frames;
/* handle wrap around of total frames counter */
@@ -248,7 +248,7 @@ AudioEngine::process_callback (jack_nframes_t nframes)
if (session_remove_pending) {
session = 0;
session_remove_pending = false;
- pthread_cond_signal (&session_removed);
+ session_removed.signal();
_processed_frames = next_processed_frames;
return 0;
}
@@ -271,14 +271,7 @@ AudioEngine::process_callback (jack_nframes_t nframes)
_processed_frames = next_processed_frames;
return 0;
}
-
- /* manage meters */
- if ((meter_interval > _buffer_size) && (last_meter_point + meter_interval < next_processed_frames)) {
- IO::Meter ();
- last_meter_point = next_processed_frames;
- }
-
if (last_monitor_check + monitor_check_interval < next_processed_frames) {
for (Ports::iterator i = ports.begin(); i != ports.end(); ++i) {
@@ -317,11 +310,6 @@ AudioEngine::jack_sample_rate_callback (jack_nframes_t nframes)
monitor_check_interval = nframes / 10;
last_monitor_check = 0;
- meter_interval = nframes / 100;
- last_meter_point = 0;
-
- maybe_start_metering_thread ();
-
if (session) {
session->set_frame_rate (nframes);
}
@@ -352,48 +340,25 @@ AudioEngine::jack_bufsize_callback (jack_nframes_t nframes)
session->set_block_size (_buffer_size);
}
- maybe_start_metering_thread ();
-
return 0;
}
void
-AudioEngine::maybe_start_metering_thread ()
-{
- if (meter_interval == 0) {
- return;
- }
-
- if (_buffer_size == 0) {
- return;
- }
-
- if (meter_interval < _buffer_size) {
- if (meter_thread_id != (pthread_t) 0) {
- pthread_cancel (meter_thread_id);
- }
- pthread_create (&meter_thread_id, 0, _meter_thread, this);
- }
-}
-
-void*
-AudioEngine::_meter_thread (void *arg)
+AudioEngine::start_metering_thread ()
{
- return static_cast<AudioEngine*>(arg)->meter_thread ();
+ if(m_meter_thread == 0) {
+ m_meter_thread = Glib::Thread::create (sigc::mem_fun(this, &AudioEngine::meter_thread), false);
+ }
}
-void*
+void
AudioEngine::meter_thread ()
{
- PBD::ThreadCreated (pthread_self(), "Metering");
-
- while (true) {
- usleep (10000); /* 1/100th sec interval */
- pthread_testcancel();
- IO::Meter ();
+ while (g_atomic_int_get(&m_meter_exit) != true) {
+ Glib::usleep (10000); /* 1/100th sec interval */
+ IO::update_meters ();
}
-
- return 0;
+ return;
}
void
@@ -407,13 +372,13 @@ AudioEngine::set_session (Session *s)
void
AudioEngine::remove_session ()
{
- LockMonitor lm (_process_lock, __LINE__, __FILE__);
+ Glib::Mutex::Lock lm (_process_lock);
if (_running) {
if (session) {
session_remove_pending = true;
- pthread_cond_wait (&session_removed, _process_lock.mutex());
+ session_removed.wait(_process_lock);
}
} else {
@@ -450,7 +415,7 @@ AudioEngine::register_audio_input_port (const string& portname)
} else {
- pthread_mutex_unlock (_process_lock.mutex());
+ _process_lock.unlock();
throw PortRegistrationFailure();
}
@@ -478,7 +443,7 @@ AudioEngine::register_audio_output_port (const string& portname)
} else {
- pthread_mutex_unlock (_process_lock.mutex());
+ _process_lock.unlock();
throw PortRegistrationFailure ();
}
@@ -635,7 +600,7 @@ AudioEngine::frames_per_cycle ()
Port *
AudioEngine::get_port_by_name (const string& portname, bool keep)
{
- LockMonitor lm (_process_lock, __LINE__, __FILE__);
+ Glib::Mutex::Lock lm (_process_lock);
if (!_running) {
if (!_has_run) {
@@ -968,7 +933,7 @@ AudioEngine::reconnect_to_jack ()
if (_jack) {
disconnect_from_jack ();
/* XXX give jackd a chance */
- usleep (250000);
+ Glib::usleep (250000);
}
if (connect_to_jack (jack_client_name)) {