diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2009-11-04 13:06:40 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2009-11-04 13:06:40 +0000 |
commit | c7a1fd39515eb493098c46183aabf89be9249065 (patch) | |
tree | 5304cac5f6000547db012f07f81980b5c08acf2e /libs | |
parent | e0af0cf5926c9f0c2833cea1b0b96c6df5934fc5 (diff) |
fix buffer content issue after seamless loop ends
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6012 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/session.h | 3 | ||||
-rw-r--r-- | libs/ardour/playlist.cc | 4 | ||||
-rw-r--r-- | libs/ardour/session_events.cc | 2 | ||||
-rw-r--r-- | libs/ardour/session_transport.cc | 51 |
4 files changed, 39 insertions, 21 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 1ff1798e3a..f1ba58dfe2 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -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); diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index d7a58dee20..3bd4b84781 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -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) { diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc index 95a2f8b2e7..d818b0b254 100644 --- a/libs/ardour/session_events.cc +++ b/libs/ardour/session_events.cc @@ -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: diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index cdf38174ae..aa4db0a7b2 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -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; |