X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fbutler.h;h=44ce7848990f534b3a7261a5997d1415a9a737c7;hb=11da4a83e499db74e75d5b59973b0e52b0c1277a;hp=b88b82073605385a3dcc3d8dc6a6ba49500ea34e;hpb=a532e7247cfccaf35edbb9b76868ead3cc9b1342;p=ardour.git diff --git a/libs/ardour/ardour/butler.h b/libs/ardour/ardour/butler.h index b88b820736..44ce784899 100644 --- a/libs/ardour/ardour/butler.h +++ b/libs/ardour/ardour/butler.h @@ -20,16 +20,32 @@ #ifndef __ardour_butler_h__ #define __ardour_butler_h__ -#include +#include + +#include + +#include "pbd/crossthread.h" +#include "pbd/ringbuffer.h" +#include "pbd/pool.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" +#include "ardour/session_handle.h" -namespace ARDOUR { -class Session; -class Butler { -public: - Butler(Session* session); +namespace ARDOUR { + +/** + * One of the Butler's functions is to clean up (ie delete) unused CrossThreadPools. + * When a thread with a CrossThreadPool terminates, its CTP is added to pool_trash. + * When the Butler thread wakes up, we check this trash buffer for CTPs, and if they + * are empty they are deleted. + */ + +class LIBARDOUR_API Butler : public SessionHandleRef +{ + public: + Butler (Session& session); ~Butler(); int start_thread(); @@ -39,34 +55,51 @@ public: void stop(); void wait_until_finished(); bool transport_work_requested() const; + void drop_references (); - float read_data_rate() const; ///< in usec - float write_data_rate() const; + void map_parameters (); - uint32_t audio_diskstream_buffer_size() const { return audio_dstream_buffer_size; } + framecnt_t audio_diskstream_capture_buffer_size() const { return audio_dstream_capture_buffer_size; } + framecnt_t audio_diskstream_playback_buffer_size() const { return audio_dstream_playback_buffer_size; } uint32_t midi_diskstream_buffer_size() const { return midi_dstream_buffer_size; } + bool flush_tracks_to_disk_after_locate (boost::shared_ptr, uint32_t& errors); + static void* _thread_work(void *arg); void* thread_work(); struct Request { enum Type { - Wake, Run, Pause, Quit }; }; - Session* session; pthread_t thread; - Glib::Mutex request_lock; - Glib::Cond paused; + bool have_thread; + Glib::Threads::Mutex request_lock; + Glib::Threads::Cond paused; bool should_run; mutable gint should_do_transport_work; - int request_pipe[2]; - uint32_t audio_dstream_buffer_size; + framecnt_t audio_dstream_capture_buffer_size; + framecnt_t audio_dstream_playback_buffer_size; uint32_t midi_dstream_buffer_size; + RingBuffer pool_trash; + +private: + void empty_pool_trash (); + void config_changed (std::string); + + bool flush_tracks_to_disk_normal (boost::shared_ptr, uint32_t& errors); + + /** + * Add request to butler thread request queue + */ + void queue_request (Request::Type r); + + CrossThreadChannel _xthread; + }; } // namespace ARDOUR