Fix off-by-one in body_range().
[ardour.git] / libs / ardour / session_transport.cc
index 8c1bc6ff90ff330203d23d03210924b2f292de9a..5fef402d9fc9597a50f0691d1a1a9e62652da98c 100644 (file)
 
 */
 
-#include <cmath>
-#include <cerrno>
-#include <unistd.h>
-
 #ifdef WAF_BUILD
 #include "libardour-config.h"
 #endif
 
+#include <cmath>
+#include <cerrno>
+#include <unistd.h>
 
 #include "pbd/undo.h"
 #include "pbd/error.h"
 #include "midi++/port.h"
 #include "midi++/manager.h"
 
-#include "ardour/ardour.h"
 #include "ardour/audioengine.h"
 #include "ardour/auditioner.h"
 #include "ardour/butler.h"
+#include "ardour/click.h"
 #include "ardour/debug.h"
 #include "ardour/location.h"
 #include "ardour/session.h"
@@ -425,6 +424,12 @@ Session::non_realtime_locate ()
                        tr->non_realtime_locate (_transport_frame);
                }
        }
+
+       /* XXX: it would be nice to generate the new clicks here (in the non-RT thread)
+          rather than clearing them so that the RT thread has to spend time constructing
+          them (in Session::click).
+        */
+       clear_clicks ();
 }
 
 
@@ -458,7 +463,6 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
                auditioner->cancel_audition ();
        }
 
-       clear_clicks();
        cumulative_rf_motion = 0;
        reset_rf_scale (0);
 
@@ -581,6 +585,8 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
 
        }
 
+       clear_clicks();
+
        /* do this before seeking, because otherwise the tracks will do the wrong thing in seamless loop mode.
        */
 
@@ -608,11 +614,13 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
 
        have_looped = false;
 
-       send_full_time_code (_transport_frame);
-
-       if (!dynamic_cast<MTC_Slave*>(_slave)) {
-               MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdStop));
-               send_mmc_locate (_transport_frame);
+       if (!_engine.freewheeling()) {
+               send_full_time_code (_transport_frame);
+               
+               if (!dynamic_cast<MTC_Slave*>(_slave)) {
+                       MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdStop));
+                       send_mmc_locate (_transport_frame);
+               }
        }
 
        if ((ptw & PostTransportLocate) && get_record_enabled()) {
@@ -1179,10 +1187,12 @@ Session::start_transport ()
                (*i)->automation_snapshot (_transport_frame, true);
        }
 
-       Timecode::Time time;
-       timecode_time_subframes (_transport_frame, time);
-       if (!dynamic_cast<MTC_Slave*>(_slave)) {
-               MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdDeferredPlay));
+       if (!_engine.freewheeling()) {
+               Timecode::Time time;
+               timecode_time_subframes (_transport_frame, time);
+               if (!dynamic_cast<MTC_Slave*>(_slave)) {
+                       MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdDeferredPlay));
+               }
        }
 
        TransportStateChange (); /* EMIT SIGNAL */
@@ -1341,13 +1351,6 @@ Session::switch_to_sync_source (SyncSource src)
        request_sync_source (new_slave);
 }
 
-void
-Session::reverse_track_buffers ()
-{
-       add_post_transport_work (PostTransportReverse);
-       _butler->schedule_transport_work ();
-}
-
 void
 Session::set_track_speed (Track* track, double speed)
 {
@@ -1503,6 +1506,10 @@ Session::xrun_recovery ()
 void
 Session::route_processors_changed (RouteProcessorChange c)
 {
+       if (ignore_route_processor_changes) {
+               return;
+       }
+
        if (c.type == RouteProcessorChange::MeterPointChange) {
                return;
        }
@@ -1546,9 +1553,11 @@ Session::maybe_stop (framepos_t limit)
 void
 Session::send_mmc_locate (framepos_t t)
 {
-       Timecode::Time time;
-       timecode_time_subframes (t, time);
-       MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (time));
+       if (!_engine.freewheeling()) {
+               Timecode::Time time;
+               timecode_time_subframes (t, time);
+               MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (time));
+       }
 }
 
 /** Ask the transport to not send timecode until further notice.  The suspension