summaryrefslogtreecommitdiff
path: root/libs/backends
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2013-10-02 19:40:48 +1000
committerTim Mayberry <mojofunk@gmail.com>2013-10-04 18:53:37 +1000
commit53ad2d187ffb31edcb90f7db5799886ee1806586 (patch)
tree8974083bf0b95e5d4dfff9fe5e53d09641d685a3 /libs/backends
parentdf363a4fb3057253c1530941176cac49a7ffd409 (diff)
Move processing thread list from ARDOUR::Graph into AudioBackend implementation
Diffstat (limited to 'libs/backends')
-rw-r--r--libs/backends/jack/jack_audiobackend.cc46
-rw-r--r--libs/backends/jack/jack_audiobackend.h7
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);