#include <glibmm/thread.h>
-#include "ardour/ardour.h"
#include "ardour/audioengine.h"
#include "ardour/auditioner.h"
#include "ardour/butler.h"
+#include "ardour/cycle_timer.h"
#include "ardour/debug.h"
+#include "ardour/graph.h"
+#include "ardour/port.h"
#include "ardour/process_thread.h"
#include "ardour/session.h"
#include "ardour/slave.h"
-#include "ardour/timestamps.h"
-#include "ardour/graph.h"
-#include "ardour/audio_port.h"
-#include "ardour/tempo.h"
-#include "ardour/cycle_timer.h"
+#include "ardour/ticker.h"
+#include "ardour/types.h"
#include "midi++/manager.h"
#include "midi++/mmc.h"
#include "i18n.h"
+#include <xmmintrin.h>
+
using namespace ARDOUR;
using namespace PBD;
using namespace std;
void
Session::process (pframes_t nframes)
{
- MIDI::Manager::instance()->cycle_start(nframes);
+ framepos_t transport_at_start = _transport_frame;
_silent = false;
_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 (!_engine.freewheeling() && 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 */
}
SendFeedback (); /* EMIT SIGNAL */
-
- MIDI::Manager::instance()->cycle_end();
}
int
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)
{
(*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)
{
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;
+ }
}
}