X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_process.cc;h=766ce395e51fc16edc60afbd46ba93526bcaf6e3;hb=e12e8716ba10ba337e298739cf59b401df805ae1;hp=404f06128f8bcafee88f7ca89bd00692a31bfd4b;hpb=ae38128f88270df6ad24a0aa167adfc248276509;p=ardour.git diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 404f06128f..766ce395e5 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -43,7 +43,7 @@ #include "midi++/mmc.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace PBD; @@ -130,10 +130,10 @@ int Session::no_roll (pframes_t nframes) { PT_TIMING_CHECK (4); - + framepos_t end_frame = _transport_frame + nframes; // FIXME: varispeed + no_roll ?? int ret = 0; - int declick = get_transport_declick_required(); + int declick = (config.get_use_transport_fades() ? get_transport_declick_required() : false); boost::shared_ptr r = routes.reader (); if (_click_io) { @@ -174,12 +174,12 @@ Session::no_roll (pframes_t nframes) int Session::process_routes (pframes_t nframes, bool& need_butler) { - int declick = get_transport_declick_required(); + int declick = (config.get_use_transport_fades() ? get_transport_declick_required() : false); boost::shared_ptr r = routes.reader (); const framepos_t start_frame = _transport_frame; const framepos_t end_frame = _transport_frame + floor (nframes * _transport_speed); - + if (_process_graph) { DEBUG_TRACE(DEBUG::ProcessThreads,"calling graph/process-routes\n"); if (_process_graph->process_routes (nframes, start_frame, end_frame, declick, need_butler) < 0) { @@ -284,7 +284,7 @@ void Session::process_with_events (pframes_t nframes) { PT_TIMING_CHECK (3); - + SessionEvent* ev; pframes_t this_nframes; framepos_t end_frame; @@ -314,6 +314,47 @@ Session::process_with_events (pframes_t nframes) process_event (ev); } + /* count in */ + if (_transport_speed != 1.0 && _count_in_samples > 0) { + _count_in_samples = 0; + } + + if (_count_in_samples > 0) { + framecnt_t ns = std::min ((framecnt_t)nframes, _count_in_samples); + + no_roll (ns); + run_click (_transport_frame - _count_in_samples, ns); + + _count_in_samples -= ns; + nframes -= ns; + + /* process events.. */ + if (!events.empty() && next_event != events.end()) { + SessionEvent* this_event = *next_event; + Events::iterator the_next_one = next_event; + ++the_next_one; + + while (this_event && this_event->action_frame == _transport_frame) { + process_event (this_event); + if (the_next_one == events.end()) { + this_event = 0; + } else { + this_event = *the_next_one; + ++the_next_one; + } + } + set_next_event (); + } + + check_declick_out (); + + if (nframes == 0) { + return; + } else { + _engine.split_cycle (ns); + } + } + /* Decide on what to do with quarter-frame MTC during this cycle */ bool const was_sending_qf_mtc = _send_qf_mtc; @@ -358,8 +399,15 @@ Session::process_with_events (pframes_t nframes) } if (events.empty() || next_event == events.end()) { - process_without_events (nframes); - return; + try_run_lua (nframes); // also during export ?? ->move to process_without_events() + /* lua scripts may inject events */ + while (_n_lua_scripts > 0 && pending_events.read (&ev, 1) == 1) { + merge_event (ev); + } + if (events.empty() || next_event == events.end()) { + process_without_events (nframes); + return; + } } if (_transport_speed == 1.0) { @@ -425,6 +473,8 @@ Session::process_with_events (pframes_t nframes) this_nframes = abs (floor(frames_moved / _transport_speed)); } + try_run_lua (this_nframes); + if (this_nframes) { click (_transport_frame, this_nframes); @@ -1106,7 +1156,7 @@ Session::process_event (SessionEvent* ev) case SessionEvent::PunchIn: // cerr << "PunchIN at " << transport_frame() << endl; - if (config.get_punch_in() && record_status() == Enabled) { + if (config.get_punch_in() && record_status() == Enabled && !preroll_record_punch_enabled()) { enable_record (); } remove = false; @@ -1115,13 +1165,21 @@ Session::process_event (SessionEvent* ev) case SessionEvent::PunchOut: // cerr << "PunchOUT at " << transport_frame() << endl; - if (config.get_punch_out()) { + if (config.get_punch_out() && !preroll_record_punch_enabled()) { step_back_from_record (); } remove = false; del = false; break; + case SessionEvent::RecordStart: + if (preroll_record_punch_enabled() && record_status() == Enabled) { + enable_record (); + } + remove = false; + del = false; + break; + case SessionEvent::StopOnce: if (!non_realtime_work_pending()) { _clear_event_type (SessionEvent::StopOnce); @@ -1221,7 +1279,10 @@ Session::compute_stop_limit () const return max_framepos; } - + if (preroll_record_punch_enabled ()) { + return max_framepos; + } + bool const punching_in = (config.get_punch_in () && _locations->auto_punch_location()); bool const punching_out = (config.get_punch_out () && _locations->auto_punch_location());