loop handling changes: always turn off play_loop @ transport stop ; remove request_pl...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 29 Oct 2009 02:05:17 +0000 (02:05 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 29 Oct 2009 02:05:17 +0000 (02:05 +0000)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@5968 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardour_ui.cc
gtk2_ardour/editor_ops.cc
libs/ardour/session_transport.cc

index 5eabae7719edfe987d1f5da14a96d73e8a1b43db..eaa1e1d0c85b3bf11dba6b47a34e87e8e45edcbd 100644 (file)
@@ -1398,10 +1398,6 @@ ARDOUR_UI::transport_stop ()
                return;
        }
        
-       if (session->get_play_loop ()) {
-               session->request_play_loop (false);
-       }
-       
        session->request_stop ();
 }
 
@@ -1467,7 +1463,7 @@ ARDOUR_UI::transport_roll ()
        //cerr << "ARDOUR_UI::transport_roll () called session->record_status() = " << session->record_status() << endl;
 
        if (session->get_play_loop()) {
-               session->request_play_loop (false);
+               // session->request_play_loop (false);
                auto_loop_button.set_visual_state (1);
                roll_button.set_visual_state (1);
        } else if (session->get_play_range ()) {
index 4026d546f42d376699749ed339650620e0b549e9..d5fac43bc6719a284bcb4d4df64ab3db44eacebe 100644 (file)
@@ -2408,9 +2408,6 @@ Editor::toggle_playback (bool with_abort)
        
        if (session->transport_rolling()) {
                session->request_stop (with_abort);
-               if (session->get_play_loop()) {
-                       session->request_play_loop (false);
-               }
        } else {
                session->request_transport_speed (1.0f);
        }
index 3e370b118c2ecf75450a65252d1a5e6496f8281c..b29816be1b63ff2ee1a7733e1a4cc80d2bfd20e2 100644 (file)
@@ -123,7 +123,7 @@ Session::request_play_loop (bool yn)
 
        ev = new Event (Event::SetLoop, Event::Add, Event::Immediate, 0, 0.0, yn);
        queue_event (ev);
-
+       
        if (!yn && Config->get_seamless_loop() && transport_rolling()) {
                // request an immediate locate to refresh the diskstreams
                // after disabling looping
@@ -385,6 +385,8 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
                     _requested_return_frame >= 0) &&
                    !(post_transport_work & PostTransportLocate)) {
 
+                       /* no explicit locate queued */
+
                        bool do_locate = false;
 
                        if (_requested_return_frame >= 0) {
@@ -392,7 +394,18 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
                                _requested_return_frame = -1;
                                do_locate = true;
                        } else {
-                               _transport_frame = last_stop_frame;
+                               if (play_loop && !synced_to_jack()) {
+                                       Location *location = _locations.auto_loop_location();
+                                       
+                                       if (location != 0) {
+                                               _transport_frame = location->start();
+                                               do_locate = true;
+                                       } else {
+                                               _transport_frame = last_stop_frame;
+                                       }
+                               } else {
+                                       _transport_frame = last_stop_frame;
+                               }
                                _requested_return_frame = -1;
                        }
 
@@ -481,9 +494,7 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
 
        if (post_transport_work & PostTransportStop) { 
                _play_range = false;
-
-               /* do not turn off autoloop on stop */
-               
+               play_loop = false;
        }
 
         nframes_t tf = _transport_frame;
@@ -528,7 +539,9 @@ Session::set_play_loop (bool yn)
 {
        /* Called from event-handling context */
        
-       if ((actively_recording() && yn) || _locations.auto_loop_location() == 0) {
+       Location *loc;
+
+       if ((actively_recording() && yn) || (loc = _locations.auto_loop_location()) == 0) {
                return;
        }
        
@@ -544,10 +557,8 @@ Session::set_play_loop (bool yn)
        
        if ((play_loop = yn)) {
 
-               Location *loc;
 
-               
-               if ((loc = _locations.auto_loop_location()) != 0) {
+               if (loc) {
 
                        if (Config->get_seamless_loop()) {
                                // set all diskstreams to use internal looping
@@ -568,25 +579,17 @@ Session::set_play_loop (bool yn)
                                }
                        }
                        
-                       /* stick in the loop event */
+                       /* put the loop event into the event list */
                        
                        Event* event = new Event (Event::AutoLoop, Event::Replace, loc->end(), loc->start(), 0.0f);
                        merge_event (event);
 
-                       /* locate to start of loop and roll if current pos is outside of the loop range */
-                       if (_transport_frame < loc->start() || _transport_frame > loc->end()) {
-                               event = new Event (Event::LocateRoll, Event::Add, Event::Immediate, loc->start(), 0, !synced_to_jack());
-                               merge_event (event);
-                       }
-                       else {
-                               // locate to current position (+ 1 to force reload)
-                               event = new Event (Event::LocateRoll, Event::Add, Event::Immediate, _transport_frame + 1, 0, !synced_to_jack());
-                               merge_event (event);
-                       }
+                       /* locate to start of loop and roll */
+                       event = new Event (Event::LocateRoll, Event::Add, Event::Immediate, loc->start(), 0, !synced_to_jack());
+                       merge_event (event);
                }
 
 
-
        } else {
                clear_events (Event::AutoLoop);
 
@@ -694,7 +697,7 @@ Session::locate (nframes_t target_frame, bool with_roll, bool with_flush, bool w
        } 
 
        if ( !with_loop || loop_changing) {
-
+               
                post_transport_work = PostTransportWork (post_transport_work | PostTransportLocate);
                
                if (with_roll) {