fix buffer content issue after seamless loop ends
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 4 Nov 2009 13:06:40 +0000 (13:06 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 4 Nov 2009 13:06:40 +0000 (13:06 +0000)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6012 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/session.h
libs/ardour/playlist.cc
libs/ardour/session_events.cc
libs/ardour/session_transport.cc

index 1ff1798e3a9660a440624aa725a968dc5bdb49f0..f1ba58dfe28b7e195e5e65d49dee09af53d7e8c1 100644 (file)
@@ -1447,7 +1447,8 @@ class Session : public PBD::StatefulDestructible
        void          change_midi_ports ();
        int           use_config_midi_ports ();
 
-       void set_play_loop (bool yn, bool leave_rolling);
+       void set_play_loop (bool yn);
+       void unset_play_loop ();
        void overwrite_some_buffers (Diskstream*);
        void flush_all_redirects ();
        int  micro_locate (nframes_t distance);
index d7a58dee200ac6f3ee968bfdf39ba37cbc1c8c81..3bd4b84781d42de432816fb85ecfb8761e8176af 100644 (file)
@@ -2020,6 +2020,8 @@ Playlist::raise_region_to_top (boost::shared_ptr<Region> region)
        switch (Config->get_layer_model()) {
        case LaterHigher:
                return;
+       default:
+               break;
        }
 
        RegionList::size_type sz = regions.size();
@@ -2043,6 +2045,8 @@ Playlist::lower_region_to_bottom (boost::shared_ptr<Region> region)
        switch (Config->get_layer_model()) {
        case LaterHigher:
                return;
+       default:
+               break;
        }
 
        if (region->layer() == 0) {
index 95a2f8b2e7e534d3ea5b86b39cf92241cb3ec08f..d818b0b2548631756eaf3c977b4ac4692c844ce8 100644 (file)
@@ -317,7 +317,7 @@ Session::process_event (Event* ev)
 
        switch (ev->type) {
        case Event::SetLoop:
-               set_play_loop (ev->yes_or_no, (ev->speed == 1.0f));
+               set_play_loop (ev->yes_or_no);
                break;
 
        case Event::AutoLoop:
index cdf38174aee6dceecd655fb64152bf19be261c43..aa4db0a7b282a8da223794f5f72cccd7f4a47744 100644 (file)
@@ -444,8 +444,18 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
 
        }
 
+       /* unconditionally reset these flags. if play_loop is still true then Diskstream::seek() will do
+          the wrong thing in seamless loop mode.
+       */
+
+       if (post_transport_work & PostTransportStop) { 
+               _play_range = false;
+               unset_play_loop ();
+       }
+
        /* this for() block can be put inside the previous if() and has the effect of ... ??? what */
 
+
        for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
                if (!(*i)->hidden()) {
                        if ((*i)->speed() != 1.0f || (*i)->speed() != -1.0f) {
@@ -505,11 +515,6 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
                DurationChanged (); /* EMIT SIGNAL */
        }
 
-       if (post_transport_work & PostTransportStop) { 
-               _play_range = false;
-               play_loop = false;
-       }
-
         nframes_t tf = _transport_frame;
 
         PositionChanged (tf); /* EMIT SIGNAL */
@@ -548,7 +553,22 @@ Session::check_declick_out ()
 }
 
 void
-Session::set_play_loop (bool yn, bool leave_rolling)
+Session::unset_play_loop ()
+{
+       play_loop = false;
+       clear_events (Event::AutoLoop);
+       
+       // set all diskstreams to NOT use internal looping
+       boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
+       for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
+               if (!(*i)->hidden()) {
+                       (*i)->set_loop (0);
+               }
+       }
+}
+
+void
+Session::set_play_loop (bool yn)
 {
        /* Called from event-handling context */
 
@@ -571,7 +591,9 @@ Session::set_play_loop (bool yn, bool leave_rolling)
                return;
        }
        
-       if ((play_loop = yn)) {
+       if (yn) {
+
+               play_loop = true;
 
                if (loc) {
 
@@ -608,16 +630,7 @@ Session::set_play_loop (bool yn, bool leave_rolling)
 
 
        } else {
-               clear_events (Event::AutoLoop);
-
-               // set all diskstreams to NOT use internal looping
-               boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
-               for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
-                       if (!(*i)->hidden()) {
-                               (*i)->set_loop (0);
-                       }
-               }
-               
+               unset_play_loop ();
        }
 
        TransportStateChange ();
@@ -774,7 +787,7 @@ Session::locate (nframes_t target_frame, bool with_roll, bool with_flush, bool w
                
                if (al && (_transport_frame < al->start() || _transport_frame > al->end())) {
                        // cancel looping directly, this is called from event handling context
-                       set_play_loop (false, false);
+                       set_play_loop (false);
                }
                else if (al && _transport_frame == al->start()) {
                        if (with_loop) {
@@ -1156,7 +1169,7 @@ Session::set_play_range (bool yn, bool leave_rolling)
 
        if (yn) {
                /* cancel loop play */
-               set_play_loop (false, true);
+               set_play_loop (false);
        }
 
        _play_range = yn;