diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-09-12 11:32:09 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-09-12 11:32:09 -0400 |
commit | 4a6412aebe4f18578f201e99ddc74fc5d9cb6bfc (patch) | |
tree | 339637963f785f97b766424b9d63f4ee201af754 /libs/ardour | |
parent | bb826f4beebfcedc50570b818c305560d2233e47 (diff) | |
parent | 4df3666738607039445ebc9fa083bf5c23ac5539 (diff) |
merge with master
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/audio_backend.h | 8 | ||||
-rw-r--r-- | libs/ardour/ardour/audioengine.h | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/graph.h | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/types.h | 11 | ||||
-rw-r--r-- | libs/ardour/audioengine.cc | 10 | ||||
-rw-r--r-- | libs/ardour/graph.cc | 12 |
6 files changed, 36 insertions, 11 deletions
diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h index ab37bea526..6c4a54da3e 100644 --- a/libs/ardour/ardour/audio_backend.h +++ b/libs/ardour/ardour/audio_backend.h @@ -399,7 +399,13 @@ class AudioBackend { * stacksize. The thread will begin executing @param func, and will exit * when that function returns. */ - virtual int create_process_thread (boost::function<void()> func, pthread_t*, size_t stacksize) = 0; + virtual int create_process_thread (boost::function<void()> func, AudioBackendNativeThread*, size_t stacksize) = 0; + + /** Wait for the thread specified by @param thread to exit. + * + * Return zero on success, non-zero on failure. + */ + virtual int wait_for_process_thread_exit (AudioBackendNativeThread thread) = 0; virtual void update_latencies () = 0; diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index cf4f91d4d0..21206da8fc 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -100,7 +100,8 @@ public: pframes_t sample_time_at_cycle_start (); pframes_t samples_since_cycle_start (); bool get_sync_offset (pframes_t& offset) const; - int create_process_thread (boost::function<void()> func, pthread_t*, size_t stacksize); + int create_process_thread (boost::function<void()> func, AudioBackendNativeThread*, size_t stacksize); + int wait_for_process_thread_exit (AudioBackendNativeThread); bool is_realtime() const; bool connected() const; diff --git a/libs/ardour/ardour/graph.h b/libs/ardour/ardour/graph.h index cac09d34af..08af6fb721 100644 --- a/libs/ardour/ardour/graph.h +++ b/libs/ardour/ardour/graph.h @@ -36,6 +36,7 @@ #include "pbd/semutils.h" #include "ardour/types.h" +#include "ardour/audio_backend.h" #include "ardour/session_handle.h" namespace ARDOUR @@ -92,7 +93,7 @@ protected: virtual void session_going_away (); private: - std::list<pthread_t> _thread_list; + std::list<AudioBackendNativeThread> _thread_list; volatile bool _quit_threads; void reset_thread_list (); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 17bffc20e4..f2319d7669 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -26,6 +26,7 @@ #include <boost/shared_ptr.hpp> #include <sys/types.h> #include <stdint.h> +#include <pthread.h> #include <inttypes.h> @@ -609,6 +610,16 @@ namespace ARDOUR { uint32_t max; //< samples }; +/* PLATFORM SPECIFIC #ifdef's here */ + + /** Define the native thread type used on the platform */ + typedef pthread_t AudioBackendNativeThread; + static inline bool self_thread_equal (AudioBackendNativeThread thr) { + return pthread_equal (thr, pthread_self()); + } + +/* PLATFORM SPECIFIC #endif's here */ + } // namespace ARDOUR diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 0ff8cd89ef..ded8bf39b5 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -814,7 +814,7 @@ AudioEngine::get_sync_offset (pframes_t& offset) const } int -AudioEngine::create_process_thread (boost::function<void()> func, pthread_t* thr, size_t stacksize) +AudioEngine::create_process_thread (boost::function<void()> func, AudioBackendNativeThread* thr, size_t stacksize) { if (!_backend) { return -1; @@ -822,6 +822,14 @@ AudioEngine::create_process_thread (boost::function<void()> func, pthread_t* thr return _backend->create_process_thread (func, thr, stacksize); } +int +AudioEngine::wait_for_process_thread_exit (AudioBackendNativeThread thr) +{ + if (!_backend) { + return 0; + } + return _backend->wait_for_process_thread_exit (thr); +} int AudioEngine::set_device_name (const std::string& name) diff --git a/libs/ardour/graph.cc b/libs/ardour/graph.cc index 2425f8b6ef..50a66b6144 100644 --- a/libs/ardour/graph.cc +++ b/libs/ardour/graph.cc @@ -102,7 +102,7 @@ Graph::reset_thread_list () } Glib::Threads::Mutex::Lock lm (_session.engine().process_lock()); - jack_native_thread_t a_thread; + AudioBackendNativeThread a_thread; if (!_thread_list.empty()) { drop_threads (); @@ -147,8 +147,8 @@ Graph::drop_threads () _callback_start_sem.signal (); - for (list<jack_native_thread_t>::iterator i = _thread_list.begin(); i != _thread_list.end(); ++i) { - AudioEngine::instance()->stop_process_thread(*i); + for (list<AudioBackendNativeThread>::iterator i = _thread_list.begin(); i != _thread_list.end(); ++i) { + AudioEngine::instance()->wait_for_process_thread_exit (*i); } _thread_list.clear (); @@ -584,12 +584,10 @@ Graph::process_one_route (Route* route) bool Graph::in_process_thread () const { -#ifndef COMPILER_MINGW - for (list<pthread_t>::const_iterator i = _thread_list.begin (); i != _thread_list.end(); ++i) { - if (pthread_equal(*i, pthread_self())) { + for (list<AudioBackendNativeThread>::const_iterator i = _thread_list.begin (); i != _thread_list.end(); ++i) { + if (self_thread_equal (*i)) { return true; } } -#endif return false; } |