X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_process.cc;h=6d8c0f9f70323ddd56f92fcc2a41a92e83b8b368;hb=316973d7c7bc99bfef6367d42009883d0de2abbd;hp=273a40366da94135f3b3ff0656e86d1bd2dfb499;hpb=eaaca760c9e2e259f87801bce59442f5cf9d2210;p=ardour.git diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 273a40366d..6d8c0f9f70 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -40,13 +40,10 @@ #include "ardour/ticker.h" #include "ardour/types.h" -#include "midi++/manager.h" #include "midi++/mmc.h" #include "i18n.h" -#include - using namespace ARDOUR; using namespace PBD; using namespace std; @@ -86,8 +83,8 @@ Session::process (pframes_t nframes) */ try { - if (!_engine.freewheeling() && Config->get_send_midi_clock() && transport_speed() == 1.0f && midi_clock->has_midi_port()) { - midi_clock->tick (transport_at_start); + if (!_silent && !_engine.freewheeling() && Config->get_send_midi_clock() && (transport_speed() == 1.0f || transport_speed() == 0.0f) && midi_clock->has_midi_port()) { + midi_clock->tick (transport_at_start, nframes); } } catch (...) { /* don't bother with a message */ @@ -116,6 +113,8 @@ Session::no_roll (pframes_t nframes) _click_io->silence (nframes); } + ltc_tx_send_time_code_for_cycle (_transport_frame, end_frame, _target_transport_speed, _transport_speed, nframes); + if (_process_graph) { DEBUG_TRACE(DEBUG::ProcessThreads,"calling graph/no-roll\n"); _process_graph->routes_no_roll( nframes, _transport_frame, end_frame, non_realtime_work_pending(), declick); @@ -123,7 +122,7 @@ Session::no_roll (pframes_t nframes) PT_TIMING_CHECK (10); for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { - if ((*i)->is_hidden()) { + if ((*i)->is_auditioner()) { continue; } @@ -168,7 +167,7 @@ Session::process_routes (pframes_t nframes, bool& need_butler) int ret; - if ((*i)->is_hidden()) { + if ((*i)->is_auditioner()) { continue; } @@ -208,7 +207,7 @@ Session::silent_process_routes (pframes_t nframes, bool& need_butler) int ret; - if ((*i)->is_hidden()) { + if ((*i)->is_auditioner()) { continue; } @@ -325,7 +324,7 @@ Session::process_with_events (pframes_t nframes) * and prepare for rolling) */ if (_send_timecode_update) { - send_full_time_code (_transport_frame); + send_full_time_code (_transport_frame, nframes); } if (!process_can_proceed()) { @@ -341,8 +340,8 @@ Session::process_with_events (pframes_t nframes) if (_transport_speed == 1.0) { frames_moved = (framecnt_t) nframes; } else { - interpolation.set_target_speed (fabs(_target_transport_speed)); - interpolation.set_speed (fabs(_transport_speed)); + interpolation.set_target_speed (_target_transport_speed); + interpolation.set_speed (_transport_speed); frames_moved = (framecnt_t) interpolation.interpolate (0, nframes, 0, 0); } @@ -422,7 +421,9 @@ Session::process_with_events (pframes_t nframes) check_declick_out (); } - _engine.split_cycle (this_nframes); + if (nframes > 0) { + _engine.split_cycle (this_nframes); + } /* now handle this event and all others scheduled for the same time */ @@ -513,7 +514,9 @@ Session::follow_slave (pframes_t nframes) slave_speed = 0.0f; } - if (_slave->is_always_synced() || Config->get_timecode_source_is_synced()) { + if (_slave->is_always_synced() || + (Config->get_timecode_source_is_synced() && (dynamic_cast(_slave)) != 0) + ) { /* if the TC source is synced, then we assume that its speed is binary: 0.0 or 1.0 @@ -541,7 +544,9 @@ Session::follow_slave (pframes_t nframes) _slave_state, slave_transport_frame, slave_speed, this_delta, average_slave_delta)); - if (_slave_state == Running && !_slave->is_always_synced() && !Config->get_timecode_source_is_synced()) { + if (_slave_state == Running && !_slave->is_always_synced() && + !(Config->get_timecode_source_is_synced() && (dynamic_cast(_slave)) != 0) + ) { if (_transport_speed != 0.0f) { @@ -653,7 +658,10 @@ Session::track_slave_state (float slave_speed, framepos_t slave_transport_frame, } else { - _slave_state = Running; + DEBUG_TRACE (DEBUG::Slave, string_compose ("slave stopped -> running at %1\n", slave_transport_frame)); + + memset (delta_accumulator, 0, sizeof (int32_t) * delta_accumulator_size); + average_slave_delta = 0L; Location* al = _locations->auto_loop_location(); @@ -663,8 +671,10 @@ Session::track_slave_state (float slave_speed, framepos_t slave_transport_frame, } if (slave_transport_frame != _transport_frame) { + DEBUG_TRACE (DEBUG::Slave, string_compose ("require locate to run. eng: %1 -> sl: %2\n", _transport_frame, slave_transport_frame)); locate (slave_transport_frame, false, false); } + _slave_state = Running; } break; @@ -713,9 +723,6 @@ Session::track_slave_state (float slave_speed, framepos_t slave_transport_frame, cerr << "cannot micro-seek\n"; /* XXX what? */ } - - memset (delta_accumulator, 0, sizeof (int32_t) * delta_accumulator_size); - average_slave_delta = 0L; } } @@ -738,7 +745,7 @@ Session::track_slave_state (float slave_speed, framepos_t slave_transport_frame, force_locate (slave_transport_frame, false); } - _slave_state = Stopped; + reset_slave_state(); } } @@ -787,6 +794,7 @@ Session::process_without_events (pframes_t nframes) if (!_exporting && _slave) { if (!follow_slave (nframes)) { + ltc_tx_send_time_code_for_cycle (_transport_frame, _transport_frame, 0, 0 , nframes); return; } } @@ -799,8 +807,8 @@ Session::process_without_events (pframes_t nframes) if (_transport_speed == 1.0) { frames_moved = (framecnt_t) nframes; } else { - interpolation.set_target_speed (fabs(_target_transport_speed)); - interpolation.set_speed (fabs(_transport_speed)); + interpolation.set_target_speed (_target_transport_speed); + interpolation.set_speed (_transport_speed); frames_moved = (framecnt_t) interpolation.interpolate (0, nframes, 0, 0); } @@ -808,6 +816,8 @@ Session::process_without_events (pframes_t nframes) send_midi_time_code_for_cycle (_transport_frame, _transport_frame + frames_moved, nframes); } + ltc_tx_send_time_code_for_cycle (_transport_frame, _transport_frame + frames_moved, _target_transport_speed, _transport_speed, nframes); + framepos_t const stop_limit = compute_stop_limit (); if (maybe_stop (stop_limit)) { @@ -828,16 +838,6 @@ Session::process_without_events (pframes_t nframes) get_track_statistics (); - /* XXX: I'm not sure whether this is correct, but at least it - matches process_with_events, so that this new frames_moved - is -ve when transport speed is -ve. This means that the - transport position is updated correctly when we are in - reverse. It seems a bit wrong that we're not using the - interpolator to compute this. - */ - - frames_moved = (framecnt_t) floor (_transport_speed * nframes); - if (frames_moved < 0) { decrement_transport_position (-frames_moved); } else { @@ -862,7 +862,7 @@ Session::process_audition (pframes_t nframes) boost::shared_ptr r = routes.reader (); for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { - if (!(*i)->is_hidden()) { + if (!(*i)->is_auditioner()) { (*i)->silence (nframes); } } @@ -876,7 +876,7 @@ Session::process_audition (pframes_t nframes) /* if using a monitor section, run it because otherwise we don't hear anything */ if (auditioner->needs_monitor()) { - _monitor_out->passthru (_transport_frame, _transport_frame + nframes, nframes, false); + _monitor_out->monitor_run (_transport_frame, _transport_frame + nframes, nframes, false); } /* handle pending events */ @@ -1176,6 +1176,11 @@ Session::compute_stop_limit () const if (!Config->get_stop_at_session_end ()) { return max_framepos; } + + if (_slave) { + 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());