diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-10-22 17:02:15 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-10-22 17:07:11 -0400 |
commit | 68458cde69bb6aae4dc8d3e5dce3e0ddc1be32e6 (patch) | |
tree | efefa6245cac2907d73d481c816b660d2af2f63f /libs/backends | |
parent | aa0effb4cb38f4c3a06564bd9e6a0ee516d4f958 (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.cc | 4 | ||||
-rw-r--r-- | libs/backends/dummy/dummy_audiobackend.cc | 4 | ||||
-rw-r--r-- | libs/backends/jack/jack_audiobackend.cc | 12 | ||||
-rw-r--r-- | libs/backends/jack/jack_audiobackend.h | 1 | ||||
-rw-r--r-- | libs/backends/wavesaudio/waves_audiobackend.cc | 22 | ||||
-rw-r--r-- | libs/backends/wavesaudio/waves_audiobackend.h | 1 |
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; |