diff options
author | Tim Mayberry <mojofunk@gmail.com> | 2013-08-14 20:30:09 +1000 |
---|---|---|
committer | Tim Mayberry <mojofunk@gmail.com> | 2013-10-04 18:51:47 +1000 |
commit | df363a4fb3057253c1530941176cac49a7ffd409 (patch) | |
tree | 76a2423b920a8c476b5df1da44b964afcb4dc0c2 /libs/backends | |
parent | 82f0f3a9a76097402afae8be1c9a65d526ad8cf2 (diff) |
Add AudioBackendThread class to support different thread type on windows
Diffstat (limited to 'libs/backends')
-rw-r--r-- | libs/backends/jack/jack_audiobackend.cc | 48 | ||||
-rw-r--r-- | libs/backends/jack/jack_audiobackend.h | 5 |
2 files changed, 45 insertions, 8 deletions
diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index c6a523f4d2..cd4874e85a 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -33,6 +33,7 @@ #include "ardour/audioengine.h" #include "ardour/session.h" #include "ardour/types.h" +#include "ardour/audio_backend_thread.h" #include "jack_audiobackend.h" #include "jack_connection.h" @@ -45,6 +46,17 @@ using namespace PBD; using std::string; using std::vector; +class JACKAudioBackendThread : public AudioBackendThread +{ +public: + + JACKAudioBackendThread (jack_native_thread_t id) + : thread_id(id) { } + + jack_native_thread_t thread_id; + +}; + #define GET_PRIVATE_JACK_POINTER(localvar) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return; } #define GET_PRIVATE_JACK_POINTER_RET(localvar,r) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return r; } @@ -825,25 +837,49 @@ JACKAudioBackend::_latency_callback (jack_latency_callback_mode_t mode, void* ar } int -JACKAudioBackend::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize) +JACKAudioBackend::create_process_thread (boost::function<void()> f, AudioBackendThread* backend_thread, size_t stacksize) { GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1); + + jack_native_thread_t thread_id; ThreadData* td = new ThreadData (this, f, stacksize); - if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack), + if (jack_client_create_thread (_priv_jack, &thread_id, jack_client_real_time_priority (_priv_jack), jack_is_realtime (_priv_jack), _start_process_thread, td)) { return -1; } - return 0; + backend_thread = new JACKAudioBackendThread(thread_id); + return 0; } int -JACKAudioBackend::wait_for_process_thread_exit (AudioBackendNativeThread thr) +JACKAudioBackend::join_process_thread (AudioBackendThread* backend_thread) { + GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1); + + JACKAudioBackendThread * jack_thread = dynamic_cast<JACKAudioBackendThread*>(backend_thread); + int ret = 0; + +#if defined(USING_JACK2_EXPANSION_OF_JACK_API) || defined(PLATFORM_WINDOWS) + if (jack_client_stop_thread (_priv_jack, jack_thread->thread_id) != 0) { + error << "AudioEngine: cannot stop process thread" << endmsg; + ret = -1; + } +#else void* status; - /* this doesn't actively try to stop the thread, it just waits till it exits */ - return pthread_join (thr, &status); + ret = pthread_join (jack_thread->thread_id, &status); +#endif + delete jack_thread; + return ret; +} + +bool +JACKAudioBackend::in_process_thread () +{ + // XXX TODO + + return false; } void* diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index 9ab545f3ee..822dc71053 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -103,8 +103,9 @@ class JACKAudioBackend : public AudioBackend { size_t raw_buffer_size (DataType t); - int create_process_thread (boost::function<void()> func, AudioBackendNativeThread*, size_t stacksize); - int wait_for_process_thread_exit (AudioBackendNativeThread); + int create_process_thread (boost::function<void()> func, AudioBackendThread*, size_t stacksize); + int join_process_thread (AudioBackendThread*); + bool in_process_thread (); void transport_start (); void transport_stop (); |