X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_process.cc;h=cd3c023f3eed5ad40e565687838be052937aa079;hb=02ec346c2b8a8872bfb3b7f231556c0f514ff95f;hp=897b58ec8e14453cd5d1dec5773efddf20dfab8a;hpb=e317386c5cde5741a8279bf480240293720d6788;p=ardour.git diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 897b58ec8e..cd3c023f3e 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -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; + } } }