handle no audio-output AUs
[ardour.git] / libs / ardour / session_butler.cc
index 0ffc14ff3a9bc9fff17bc63316c9601661cb361c..259a3a1d3d6d55c42aa3a5d0bc189624d35f3b52 100644 (file)
 
 */
 
-#include <algorithm>
-#include <string>
-#include <cmath>
-#include <cerrno>
-#include <unistd.h>
-#include <fcntl.h>
-#include <poll.h>
-
-#include <glibmm/thread.h>
-
 #include "pbd/error.h"
 #include "pbd/pthread_utils.h"
 #include "pbd/stacktrace.h"
 
-#include "ardour/audio_diskstream.h"
-#include "ardour/audioengine.h"
 #include "ardour/butler.h"
-#include "ardour/configuration.h"
-#include "ardour/crossfade.h"
-#include "ardour/io.h"
-#include "ardour/midi_diskstream.h"
+#include "ardour/route.h"
 #include "ardour/session.h"
-#include "ardour/timestamps.h"
+#include "ardour/session_event.h"
+#include "ardour/track.h"
+#include "ardour/types.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
-/* XXX put this in the right place */
+/*---------------------------------------------------------------------------
+ BUTLER THREAD
+ ---------------------------------------------------------------------------*/
 
-static inline uint32_t next_power_of_two (uint32_t n)
+void
+Session::adjust_playback_buffering ()
 {
-       --n;
-       n |= n >> 16;
-       n |= n >> 8;
-       n |= n >> 4;
-       n |= n >> 2;
-       n |= n >> 1;
-       ++n;
-       return n;
+        request_stop (false, false);
+       SessionEvent *ev = new SessionEvent (SessionEvent::AdjustPlaybackBuffering, SessionEvent::Add, SessionEvent::Immediate, 0, 0, 0.0);
+       queue_event (ev);
 }
 
-/*---------------------------------------------------------------------------
- BUTLER THREAD
- ---------------------------------------------------------------------------*/
+void
+Session::adjust_capture_buffering ()
+{
+        request_stop (false, false);
+       SessionEvent *ev = new SessionEvent (SessionEvent::AdjustCaptureBuffering, SessionEvent::Add, SessionEvent::Immediate, 0, 0, 0.0);
+       queue_event (ev);
+}
+
+void
+Session::schedule_playback_buffering_adjustment ()
+{
+       add_post_transport_work (PostTransportAdjustPlaybackBuffering);
+       _butler->schedule_transport_work ();
+}
+
+void
+Session::schedule_capture_buffering_adjustment ()
+{
+       add_post_transport_work (PostTransportAdjustCaptureBuffering);
+       _butler->schedule_transport_work ();
+}
 
 void
 Session::schedule_curve_reallocation ()
@@ -73,30 +76,33 @@ Session::schedule_curve_reallocation ()
 }
 
 void
-Session::request_overwrite_buffer (Diskstream* stream)
+Session::request_overwrite_buffer (Track* t)
 {
-       Event *ev = new Event (Event::Overwrite, Event::Add, Event::Immediate, 0, 0, 0.0);
-       ev->set_ptr (stream);
+       SessionEvent *ev = new SessionEvent (SessionEvent::Overwrite, SessionEvent::Add, SessionEvent::Immediate, 0, 0, 0.0);
+       ev->set_ptr (t);
        queue_event (ev);
 }
 
 /** Process thread. */
 void
-Session::overwrite_some_buffers (Diskstream* ds)
+Session::overwrite_some_buffers (Track* t)
 {
        if (actively_recording()) {
                return;
        }
 
-       if (ds) {
+       if (t) {
 
-               ds->set_pending_overwrite (true);
+               t->set_pending_overwrite (true);
 
        } else {
 
-               boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
-               for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
-                       (*i)->set_pending_overwrite (true);
+               boost::shared_ptr<RouteList> rl = routes.reader();
+               for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
+                       boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
+                       if (tr) {
+                               tr->set_pending_overwrite (true);
+                       }
                }
        }
 
@@ -115,28 +121,3 @@ Session::capture_load ()
 {
        return (uint32_t) g_atomic_int_get (&_capture_load);
 }
-
-uint32_t
-Session::playback_load_min ()
-{
-       return (uint32_t) g_atomic_int_get (&_playback_load_min);
-}
-
-uint32_t
-Session::capture_load_min ()
-{
-       return (uint32_t) g_atomic_int_get (&_capture_load_min);
-}
-
-void
-Session::reset_capture_load_min ()
-{
-       g_atomic_int_set (&_capture_load_min, 100);
-}
-
-void
-Session::reset_playback_load_min ()
-{
-       g_atomic_int_set (&_playback_load_min, 100);
-}
-