From 598b412e6b2ee0f042e983b69cd6e2d84228e18f Mon Sep 17 00:00:00 2001 From: Hans Baier Date: Mon, 5 Jan 2009 09:22:27 +0000 Subject: [PATCH] * further reduce the spaghettiness of Session::follow_slave git-svn-id: svn://localhost/ardour2/branches/3.0@4386 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/session.h | 1 + libs/ardour/session_process.cc | 84 ++++++++++++++++++---------------- 2 files changed, 46 insertions(+), 39 deletions(-) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 87bf7972a2..81134d16fd 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1084,6 +1084,7 @@ class Session : public PBD::StatefulDestructible nframes_t slave_transport_frame, nframes_t this_delta, bool starting); + void follow_slave_silently(nframes_t nframes, nframes_t offset, float slave_speed); void set_slave_source (SlaveSource); diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 0be6c8abdc..1f80f9b60a 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -583,45 +583,8 @@ Session::follow_slave (nframes_t nframes, nframes_t offset) cerr << "reached silent_motion:" <get_stop_at_session_end()) { - stop_limit = current_end_frame(); - } else { - stop_limit = max_frames; - } - } - - maybe_stop (stop_limit); - } - + follow_slave_silently(nframes, offset, slave_speed); + noroll: /* don't move at all */ #ifdef DEBUG_SLAVES @@ -779,6 +742,49 @@ Session::track_slave_state( } } +void +Session::follow_slave_silently(nframes_t nframes, nframes_t offset, float slave_speed) +{ + if (slave_speed && _transport_speed) { + + /* something isn't right, but we should move with the master + for now. + */ + + bool need_butler; + + prepare_diskstreams (); + silent_process_routes (nframes, offset); + commit_diskstreams (nframes, need_butler); + + if (need_butler) { + summon_butler (); + } + + int32_t frames_moved = (int32_t) floor (_transport_speed * nframes); + + if (frames_moved < 0) { + decrement_transport_position (-frames_moved); + } else { + increment_transport_position (frames_moved); + } + + nframes_t stop_limit; + + if (actively_recording()) { + stop_limit = max_frames; + } else { + if (Config->get_stop_at_session_end()) { + stop_limit = current_end_frame(); + } else { + stop_limit = max_frames; + } + } + + maybe_stop (stop_limit); + } +} + void Session::process_without_events (nframes_t nframes) {