#ifndef __ardour_butler_h__
#define __ardour_butler_h__
-#include <glibmm/thread.h>
+#include <pthread.h>
+
+#include <glibmm/threads.h>
+
+#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();
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<RouteList>, 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<CrossThreadPool*> pool_trash;
+
+private:
+ void empty_pool_trash ();
+ void config_changed (std::string);
+
+ bool flush_tracks_to_disk_normal (boost::shared_ptr<RouteList>, uint32_t& errors);
+
+ /**
+ * Add request to butler thread request queue
+ */
+ void queue_request (Request::Type r);
+
+ CrossThreadChannel _xthread;
+
};
} // namespace ARDOUR