summaryrefslogtreecommitdiff
path: root/libs/backends
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-10-22 17:02:15 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2014-10-22 17:07:11 -0400
commit68458cde69bb6aae4dc8d3e5dce3e0ddc1be32e6 (patch)
treeefefa6245cac2907d73d481c816b660d2af2f63f /libs/backends
parentaa0effb4cb38f4c3a06564bd9e6a0ee516d4f958 (diff)
fix all 4 backends' failure to include the main "backend" thread when computing ::in_process_thread()
Diffstat (limited to 'libs/backends')
-rw-r--r--libs/backends/alsa/alsa_audiobackend.cc4
-rw-r--r--libs/backends/dummy/dummy_audiobackend.cc4
-rw-r--r--libs/backends/jack/jack_audiobackend.cc12
-rw-r--r--libs/backends/jack/jack_audiobackend.h1
-rw-r--r--libs/backends/wavesaudio/waves_audiobackend.cc22
-rw-r--r--libs/backends/wavesaudio/waves_audiobackend.h1
6 files changed, 37 insertions, 7 deletions
diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc
index c137078db0..a33d8d5378 100644
--- a/libs/backends/alsa/alsa_audiobackend.cc
+++ b/libs/backends/alsa/alsa_audiobackend.cc
@@ -758,6 +758,10 @@ AlsaAudioBackend::join_process_threads ()
bool
AlsaAudioBackend::in_process_thread ()
{
+ if (pthread_equal (_main_thread, pthread_self()) != 0) {
+ return true;
+ }
+
for (std::vector<pthread_t>::const_iterator i = _threads.begin (); i != _threads.end (); ++i)
{
if (pthread_equal (*i, pthread_self ()) != 0) {
diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc
index f2455702b5..567b7485e3 100644
--- a/libs/backends/dummy/dummy_audiobackend.cc
+++ b/libs/backends/dummy/dummy_audiobackend.cc
@@ -516,6 +516,10 @@ DummyAudioBackend::join_process_threads ()
bool
DummyAudioBackend::in_process_thread ()
{
+ if (pthread_equal (_main_thread, pthread_self()) != 0) {
+ return true;
+ }
+
for (std::vector<pthread_t>::const_iterator i = _threads.begin (); i != _threads.end (); ++i)
{
if (pthread_equal (*i, pthread_self ()) != 0) {
diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc
index 428d3f3c18..5dc8f23785 100644
--- a/libs/backends/jack/jack_audiobackend.cc
+++ b/libs/backends/jack/jack_audiobackend.cc
@@ -862,6 +862,16 @@ JACKAudioBackend::join_process_threads ()
bool
JACKAudioBackend::in_process_thread ()
{
+#ifdef COMPILER_MINGW
+ if (_main_thread == GetCurrentThread()) {
+ return true;
+ }
+#else // pthreads
+ if (pthread_equal (_main_thread, pthread_self()) != 0) {
+ return true;
+ }
+#endif
+
for (std::vector<jack_native_thread_t>::const_iterator i = _jack_threads.begin ();
i != _jack_threads.end(); i++) {
@@ -909,6 +919,8 @@ JACKAudioBackend::process_thread ()
/* JACK doesn't do this for us when we use the wait API
*/
+ _main_thread = pthread_self ();
+
AudioEngine::thread_init_callback (this);
while (1) {
diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h
index 5a5aaaff63..0fd06407f3 100644
--- a/libs/backends/jack/jack_audiobackend.h
+++ b/libs/backends/jack/jack_audiobackend.h
@@ -209,6 +209,7 @@ class JACKAudioBackend : public AudioBackend {
std::map<DataType,size_t> _raw_buffer_sizes;
std::vector<jack_native_thread_t> _jack_threads;
+ jack_native_thread_t _main_thread;
static int _xrun_callback (void *arg);
static void* _process_thread (void *arg);
diff --git a/libs/backends/wavesaudio/waves_audiobackend.cc b/libs/backends/wavesaudio/waves_audiobackend.cc
index 247939aca7..f7f3bee985 100644
--- a/libs/backends/wavesaudio/waves_audiobackend.cc
+++ b/libs/backends/wavesaudio/waves_audiobackend.cc
@@ -721,6 +721,11 @@ WavesAudioBackend::_audio_device_callback (const float* input_buffer,
// COMMENTED FREQUENT DBG LOGS */ std::cout << "WavesAudioBackend::_audio_device_callback ():" << _device->DeviceName () << std::endl;
_sample_time_at_cycle_start = sample_time;
_cycle_start_time_nanos = cycle_start_time_nanos;
+
+ /* There is the possibility that the thread this runs in may change from
+ * callback to callback, so do it every time.
+ */
+ _main_thread = pthread_self ();
if (_buffer_size != nframes) {
// COMMENTED DBG LOGS */ std::cout << "\tAudioEngine::thread_init_callback() buffer size and nframes are not equal: " << _buffer_size << "!=" << nframes << std::endl;
@@ -1099,13 +1104,16 @@ bool
WavesAudioBackend::in_process_thread ()
{
// COMMENTED DBG LOGS */ std::cout << "WavesAudioBackend::in_process_thread ()" << std::endl;
- for (std::vector<pthread_t>::const_iterator i = _backend_threads.begin ();
- i != _backend_threads.end (); i++) {
- if (pthread_equal (*i, pthread_self ()) != 0) {
- return true;
- }
- }
- return false;
+ if (pthread_equal (_main_thread, pthread_self()) != 0) {
+ return true;
+ }
+ for (std::vector<pthread_t>::const_iterator i = _backend_threads.begin ();
+ i != _backend_threads.end (); i++) {
+ if (pthread_equal (*i, pthread_self ()) != 0) {
+ return true;
+ }
+ }
+ return false;
}
diff --git a/libs/backends/wavesaudio/waves_audiobackend.h b/libs/backends/wavesaudio/waves_audiobackend.h
index d5bacf1ed4..57f15afc6b 100644
--- a/libs/backends/wavesaudio/waves_audiobackend.h
+++ b/libs/backends/wavesaudio/waves_audiobackend.h
@@ -316,6 +316,7 @@ class WavesMidiPort;
uint32_t _systemic_output_latency;
bool _call_thread_init_callback;
std::vector<pthread_t> _backend_threads;
+ pthread_t _main_thread;
static const size_t __max_raw_midi_buffer_size;
static const std::vector<std::string> __available_midi_options;