summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2009-11-04 13:06:40 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2009-11-04 13:06:40 +0000
commitc7a1fd39515eb493098c46183aabf89be9249065 (patch)
tree5304cac5f6000547db012f07f81980b5c08acf2e
parente0af0cf5926c9f0c2833cea1b0b96c6df5934fc5 (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
-rw-r--r--libs/ardour/ardour/session.h3
-rw-r--r--libs/ardour/playlist.cc4
-rw-r--r--libs/ardour/session_events.cc2
-rw-r--r--libs/ardour/session_transport.cc51
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;