X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fgraph.h;h=239f9ad1abec406c2976e2d1dc48d83cdad47221;hb=f8a6213454c7a0a80114ffa01c8ce432b19f4617;hp=18a8c7a4c94e1c2f5535cbbd82c79e6bb8eabe23;hpb=1d2636d76df3f6fd5eb0148f9284185561b0d2ab;p=ardour.git diff --git a/libs/ardour/ardour/graph.h b/libs/ardour/ardour/graph.h index 18a8c7a4c9..239f9ad1ab 100644 --- a/libs/ardour/ardour/graph.h +++ b/libs/ardour/ardour/graph.h @@ -28,14 +28,13 @@ #include -#include -#include - -#include +#include #include "pbd/semutils.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" +#include "ardour/audio_backend.h" #include "ardour/session_handle.h" namespace ARDOUR @@ -46,22 +45,21 @@ class Graph; class Route; class Session; +class GraphEdges; typedef boost::shared_ptr node_ptr_t; typedef std::list< node_ptr_t > node_list_t; typedef std::set< node_ptr_t > node_set_t; -class Graph : public SessionHandleRef +class LIBARDOUR_API Graph : public SessionHandleRef { public: Graph (Session & session); - uint32_t threads_in_use () const { return _thread_list.size(); } - void prep(); void trigger (GraphNode * n); - void rechain (boost::shared_ptr r); + void rechain (boost::shared_ptr, GraphEdges const &); void dump (int chain); void process(); @@ -91,11 +89,8 @@ protected: virtual void session_going_away (); private: - std::list _thread_list; - volatile bool _quit_threads; - PBD::ScopedConnection processor_usage_connection; + volatile bool _threads_active; - void parameter_changed (std::string); void reset_thread_list (); void drop_threads (); @@ -106,21 +101,25 @@ private: std::vector _trigger_queue; pthread_mutex_t _trigger_mutex; - PBD::ProcessSemaphore _execution_sem; + PBD::Semaphore _execution_sem; - PBD::ProcessSemaphore _callback_start_sem; - PBD::ProcessSemaphore _callback_done_sem; - PBD::ProcessSemaphore _cleanup_sem; + /** Signalled to start a run of the graph for a process callback */ + PBD::Semaphore _callback_start_sem; + PBD::Semaphore _callback_done_sem; + PBD::Semaphore _cleanup_sem; + /** The number of processing threads that are asleep */ volatile gint _execution_tokens; + /** The number of unprocessed nodes that do not feed any other node; updated during processing */ volatile gint _finished_refcount; + /** The initial number of nodes that do not feed any other node (for each chain) */ volatile gint _init_finished_refcount[2]; bool _graph_empty; // chain swapping - Glib::Mutex _swap_mutex; - Glib::Cond _cleanup_cond; + Glib::Threads::Mutex _swap_mutex; + Glib::Threads::Cond _cleanup_cond; volatile int _current_chain; volatile int _pending_chain; volatile int _setup_chain; @@ -135,8 +134,12 @@ private: bool _process_silent; bool _process_noroll; - int _process_retval; + int _process_retval; bool _process_need_butler; + + // enginer / thread connection + PBD::ScopedConnectionList engine_connections; + void engine_stopped (); }; } // namespace