summaryrefslogtreecommitdiff
path: root/libs/backends
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2013-08-14 20:30:09 +1000
committerTim Mayberry <mojofunk@gmail.com>2013-10-04 18:51:47 +1000
commitdf363a4fb3057253c1530941176cac49a7ffd409 (patch)
tree76a2423b920a8c476b5df1da44b964afcb4dc0c2 /libs/backends
parent82f0f3a9a76097402afae8be1c9a65d526ad8cf2 (diff)
Add AudioBackendThread class to support different thread type on windows
Diffstat (limited to 'libs/backends')
-rw-r--r--libs/backends/jack/jack_audiobackend.cc48
-rw-r--r--libs/backends/jack/jack_audiobackend.h5
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 ();