introduce the idea of a "default transport speed", used whenever Session::start_trans...
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 22 Jun 2012 14:45:44 +0000 (14:45 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 22 Jun 2012 14:45:44 +0000 (14:45 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@12819 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/shuttle_control.cc
libs/ardour/ardour/session.h
libs/ardour/ardour/session_event.h
libs/ardour/session_process.cc
libs/ardour/session_state.cc
libs/ardour/session_transport.cc

index 68d91ef162b05fad4495e7fe6802101fc7f0f427..88159fe0209b2b943121e3bcd3c37bb78525cca4 100644 (file)
@@ -278,7 +278,7 @@ ShuttleControl::on_button_release_event (GdkEventButton* ev)
 
        case 2:
                if (_session->transport_rolling()) {
-                       _session->request_transport_speed (1.0);
+                       _session->request_transport_speed (1.0, Config->get_shuttle_behaviour() == Wheel);
                }
                return true;
 
@@ -479,7 +479,7 @@ ShuttleControl::use_shuttle_fract (bool force)
                speed = shuttle_max_speed * shuttle_fract;
        }
 
-       _session->request_transport_speed_nonzero (speed);
+       _session->request_transport_speed_nonzero (speed, true);
 }
 
 bool
index f89c43ac1614777d5d46572089a83212dbd2617f..7f73d3ae775e8629074a3b7b5f3a5c9c0b5b2ea9 100644 (file)
@@ -329,8 +329,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
        void goto_start ();
        void use_rf_shuttle_speed ();
        void allow_auto_play (bool yn);
-        void request_transport_speed (double speed);
-       void request_transport_speed_nonzero (double);
+        void request_transport_speed (double speed, bool as_default = false);
+        void request_transport_speed_nonzero (double, bool as_default = false);
        void request_overwrite_buffer (Track *);
        void adjust_playback_buffering();
        void adjust_capture_buffering();
@@ -905,6 +905,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
 
        // varispeed playback
        double                  _transport_speed;
+       double                  _default_transport_speed;
        double                  _last_transport_speed;
        double                  _target_transport_speed;
        CubicInterpolation       interpolation;
@@ -1210,7 +1211,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
        void start_locate (framepos_t, bool with_roll, bool with_flush, bool with_loop=false, bool force=false);
        void force_locate (framepos_t frame, bool with_roll = false);
        void set_track_speed (Track *, double speed);
-        void set_transport_speed (double speed, bool abort = false, bool clear_state = false);
+        void set_transport_speed (double speed, bool abort = false, bool clear_state = false, bool as_default = false);
        void stop_transport (bool abort = false, bool clear_state = false);
        void start_transport ();
        void realtime_stop (bool abort, bool clear_state);
index c917e4b3cfbedb361da743aeb47362a1e37c3d4b..d8a48123a2baa23f3af87c7bce19a75ffb7be81a 100644 (file)
@@ -71,6 +71,10 @@ public:
                bool second_yes_or_no;
        };
 
+       union {
+               bool third_yes_or_no;
+       };
+
        /* 4 members to handle a multi-group event handled in RT context */
 
        typedef boost::function<void (SessionEvent*)> RTeventCallback;
@@ -85,7 +89,7 @@ public:
 
        boost::shared_ptr<Region> region;
 
-    SessionEvent (Type t, Action a, framepos_t when, framepos_t where, double spd, bool yn = false, bool yn2 = false)
+    SessionEvent (Type t, Action a, framepos_t when, framepos_t where, double spd, bool yn = false, bool yn2 = false, bool yn3 = false)
                : type (t)
                , action (a)
                , action_frame (when)
@@ -93,6 +97,7 @@ public:
                , speed (spd)
                , yes_or_no (yn)
                , second_yes_or_no (yn2)
+               , third_yes_or_no (yn3)
                , event_loop (0) {}
 
        void set_ptr (void* p) {
index 0c3b0a57ea7a1d227c6f464a6165da05b8feb193..6cebc13b0d4bc36cdb94b87272a025fcae99f177 100644 (file)
@@ -1065,7 +1065,7 @@ Session::process_event (SessionEvent* ev)
 
 
        case SessionEvent::SetTransportSpeed:
-               set_transport_speed (ev->speed, ev->yes_or_no, ev->second_yes_or_no);
+               set_transport_speed (ev->speed, ev->yes_or_no, ev->second_yes_or_no, ev->third_yes_or_no);
                break;
 
        case SessionEvent::PunchIn:
index 347c4ee35bdf684b3acb89b0f759138e4038ae29..2f69ff2dee3dbd7d337bfe7d0596ce40d8b6debe 100644 (file)
@@ -169,6 +169,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
        _solo_isolated_cnt = 0;
        g_atomic_int_set (&processing_prohibited, 0);
        _transport_speed = 0;
+       _default_transport_speed = 1.0;
        _last_transport_speed = 0;
        _target_transport_speed = 0;
        auto_play_legal = false;
index 20ac7375759cac2150da73433ac5c8c3b287dbca..27896f6e67839decfac6459e8f0d66ded3f2a0ab 100644 (file)
@@ -103,10 +103,11 @@ Session::request_sync_source (Slave* new_slave)
 }
 
 void
-Session::request_transport_speed (double speed)
+Session::request_transport_speed (double speed, bool as_default)
 {
        SessionEvent* ev = new SessionEvent (SessionEvent::SetTransportSpeed, SessionEvent::Add, SessionEvent::Immediate, 0, speed);
-       DEBUG_TRACE (DEBUG::Transport, string_compose ("Request transport speed = %1\n", speed));
+       ev->third_yes_or_no = true;
+       DEBUG_TRACE (DEBUG::Transport, string_compose ("Request transport speed = %1 as default = %2\n", speed, as_default));
        queue_event (ev);
 }
 
@@ -115,13 +116,13 @@ Session::request_transport_speed (double speed)
  *  be used by callers who are varying transport speed but don't ever want to stop it.
  */
 void
-Session::request_transport_speed_nonzero (double speed)
+Session::request_transport_speed_nonzero (double speed, bool as_default)
 {
        if (speed == 0) {
                speed = DBL_EPSILON;
        }
 
-       request_transport_speed (speed);
+       request_transport_speed (speed, as_default);
 }
 
 void
@@ -995,10 +996,10 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool
  *  @param speed New speed
  */
 void
-Session::set_transport_speed (double speed, bool abort, bool clear_state)
+Session::set_transport_speed (double speed, bool abort, bool clear_state, bool as_default)
 {
-       DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %5 Set transport speed to %1, abort = %2 clear_state = %3, current = %4\n", 
-                                                      speed, abort, clear_state, _transport_speed, _transport_frame));
+       DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %5 Set transport speed to %1, abort = %2 clear_state = %3, current = %4 as_default %5\n", 
+                                                      speed, abort, clear_state, _transport_speed, _transport_frame, as_default));
 
        if (_transport_speed == speed) {
                return;
@@ -1098,6 +1099,10 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state)
                _last_transport_speed = _transport_speed;
                _transport_speed = speed;
 
+               if (as_default) {
+                       _default_transport_speed = speed;
+               }
+
                boost::shared_ptr<RouteList> rl = routes.reader();
                for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
                        boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
@@ -1213,7 +1218,7 @@ Session::start_transport ()
 
        transport_sub_state |= PendingDeclickIn;
 
-       _transport_speed = 1.0;
+       _transport_speed = _default_transport_speed;
        _target_transport_speed = _transport_speed;
 
        boost::shared_ptr<RouteList> rl = routes.reader();