add virtual method is_instrument() to PluginInfo (already existed for AUPluginInfo...
[ardour.git] / libs / ardour / session_process.cc
index 897b58ec8e14453cd5d1dec5773efddf20dfab8a..cd3c023f3eed5ad40e565687838be052937aa079 100644 (file)
@@ -39,6 +39,7 @@
 #include "ardour/graph.h"
 #include "ardour/audio_port.h"
 #include "ardour/tempo.h"
+#include "ardour/ticker.h"
 #include "ardour/cycle_timer.h"
 
 #include "midi++/manager.h"
@@ -57,6 +58,8 @@ using namespace std;
 void
 Session::process (pframes_t nframes)
 {
+       framepos_t transport_at_start = _transport_frame;
+
        MIDI::Manager::instance()->cycle_start(nframes);
 
        _silent = false;
@@ -78,14 +81,16 @@ Session::process (pframes_t nframes)
 
        _engine.main_thread()->drop_buffers ();
 
-       // the ticker is for sending time information like MidiClock
-       framepos_t transport_frames = transport_frame();
-       Timecode::BBT_Time transport_bbt;
+       /* deliver MIDI clock. Note that we need to use the transport frame
+        * position at the start of process(), not the value at the end of
+        * it. We may already have ticked() because of a transport state
+        * change, for example.
+        */
+
        try {
-               _tempo_map->bbt_time_rt (transport_frames, transport_bbt);
-               Timecode::Time transport_timecode;
-               timecode_time(transport_frames, transport_timecode);
-               tick (transport_frames, transport_bbt, transport_timecode); /* EMIT SIGNAL */
+               if (Config->get_send_midi_clock() && transport_speed() == 1.0f && midi_clock->has_midi_port()) {
+                       midi_clock->tick (transport_at_start);
+               }
        } catch (...) {
                /* don't bother with a message */
        }
@@ -141,6 +146,9 @@ Session::no_roll (pframes_t nframes)
        return ret;
 }
 
+/** @param need_butler to be set to true by this method if it needs the butler,
+ *  otherwise it must be left alone.
+ */
 int
 Session::process_routes (pframes_t nframes, bool& need_butler)
 {
@@ -170,16 +178,25 @@ Session::process_routes (pframes_t nframes, bool& need_butler)
 
                        (*i)->set_pending_declick (declick);
 
-                       if ((ret = (*i)->roll (nframes, start_frame, end_frame, declick, need_butler)) < 0) {
+                       bool b = false;
+
+                       if ((ret = (*i)->roll (nframes, start_frame, end_frame, declick, b)) < 0) {
                                stop_transport ();
                                return -1;
                        }
+
+                       if (b) {
+                               need_butler = true;
+                       }
                }
        }
 
        return 0;
 }
 
+/** @param need_butler to be set to true by this method if it needs the butler,
+ *  otherwise it must be left alone.
+ */
 int
 Session::silent_process_routes (pframes_t nframes, bool& need_butler)
 {
@@ -199,10 +216,16 @@ Session::silent_process_routes (pframes_t nframes, bool& need_butler)
                                continue;
                        }
 
-                       if ((ret = (*i)->silent_roll (nframes, start_frame, end_frame, need_butler)) < 0) {
+                       bool b = false;
+
+                       if ((ret = (*i)->silent_roll (nframes, start_frame, end_frame, b)) < 0) {
                                stop_transport ();
                                return -1;
                        }
+
+                       if (b) {
+                               need_butler = true;
+                       }
                }
        }