diff options
author | Tim Mayberry <mojofunk@gmail.com> | 2013-10-02 19:40:48 +1000 |
---|---|---|
committer | Tim Mayberry <mojofunk@gmail.com> | 2013-10-04 18:53:37 +1000 |
commit | 53ad2d187ffb31edcb90f7db5799886ee1806586 (patch) | |
tree | 8974083bf0b95e5d4dfff9fe5e53d09641d685a3 /libs/backends | |
parent | df363a4fb3057253c1530941176cac49a7ffd409 (diff) |
Move processing thread list from ARDOUR::Graph into AudioBackend implementation
Diffstat (limited to 'libs/backends')
-rw-r--r-- | libs/backends/jack/jack_audiobackend.cc | 46 | ||||
-rw-r--r-- | libs/backends/jack/jack_audiobackend.h | 7 |
2 files changed, 28 insertions, 25 deletions
diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index cd4874e85a..19f15b1fa1 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -33,7 +33,6 @@ #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" @@ -46,16 +45,6 @@ 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; } @@ -837,40 +826,45 @@ JACKAudioBackend::_latency_callback (jack_latency_callback_mode_t mode, void* ar } int -JACKAudioBackend::create_process_thread (boost::function<void()> f, AudioBackendThread* backend_thread, size_t stacksize) +JACKAudioBackend::create_process_thread (boost::function<void()> f) { GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1); jack_native_thread_t thread_id; - ThreadData* td = new ThreadData (this, f, stacksize); + ThreadData* td = new ThreadData (this, f, thread_stack_size()); 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; } - backend_thread = new JACKAudioBackendThread(thread_id); + _jack_threads.push_back(thread_id); return 0; } int -JACKAudioBackend::join_process_thread (AudioBackendThread* backend_thread) +JACKAudioBackend::join_process_threads () { GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1); - JACKAudioBackendThread * jack_thread = dynamic_cast<JACKAudioBackendThread*>(backend_thread); int ret = 0; + for (std::vector<jack_native_thread_t>::const_iterator i = _jack_threads.begin (); + i != _jack_threads.end(); i++) { + #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; - } + if (jack_client_stop_thread (_priv_jack, *i) != 0) { #else - void* status; - ret = pthread_join (jack_thread->thread_id, &status); + void* status; + if (pthread_join (*i, &status) != 0) { #endif - delete jack_thread; + error << "AudioEngine: cannot stop process thread" << endmsg; + ret += -1; + } + } + + _jack_threads.clear(); + return ret; } @@ -882,6 +876,12 @@ JACKAudioBackend::in_process_thread () return false; } +uint32_t +JACKAudioBackend::process_thread_count () +{ + return _jack_threads.size(); +} + void* JACKAudioBackend::_start_process_thread (void* arg) { diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index 822dc71053..b8d8b3b3f1 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -103,9 +103,10 @@ class JACKAudioBackend : public AudioBackend { size_t raw_buffer_size (DataType t); - int create_process_thread (boost::function<void()> func, AudioBackendThread*, size_t stacksize); - int join_process_thread (AudioBackendThread*); + int create_process_thread (boost::function<void()> func); + int join_process_threads (); bool in_process_thread (); + uint32_t process_thread_count (); void transport_start (); void transport_stop (); @@ -185,6 +186,8 @@ class JACKAudioBackend : public AudioBackend { bool _freewheeling; std::map<DataType,size_t> _raw_buffer_sizes; + std::vector<jack_native_thread_t> _jack_threads; + static int _xrun_callback (void *arg); static void* _process_thread (void *arg); static int _sample_rate_callback (pframes_t nframes, void *arg); |