X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsimultaneous-music-iterator.cc;h=e892776b61a39e6f4814eb350500ab706a45c4ee;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=3e42ed96c07dd99685af09aa148df16b77485f1a;hpb=b12ee555e33d483eed0832d8502ad7a282ef9796;p=lilypond.git diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc index 3e42ed96c0..e892776b61 100644 --- a/lily/simultaneous-music-iterator.cc +++ b/lily/simultaneous-music-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2014 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,7 +39,7 @@ void Simultaneous_music_iterator::derived_substitute (Context *f, Context *t) { for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) - Music_iterator::unsmob (scm_car (s))->substitute_outlet (f, t); + unsmob (scm_car (s))->substitute_outlet (f, t); } void @@ -53,10 +53,10 @@ Simultaneous_music_iterator::construct_children () SCM *tail = &children_list_; for (; scm_is_pair (i); i = scm_cdr (i), j++) { - Music *mus = Music::unsmob (scm_car (i)); + Music *mus = unsmob (scm_car (i)); SCM scm_iter = get_static_get_iterator (mus); - Music_iterator *mi = Music_iterator::unsmob (scm_iter); + Music_iterator *mi = unsmob (scm_iter); /* if create_separate_contexts_ is set, create a new context with the number number as name */ @@ -82,36 +82,33 @@ Simultaneous_music_iterator::construct_children () } } -// If there are non-run-always iterators and all of them die, take the -// rest of them along. +// If we have some iterators with definite next moment and no of them +// remain after processing, we take the iterators with indefinite next +// moment along. That makes sure that no Lyric_combine_music_iterator +// will outstay its welcome (issue 2010). + void Simultaneous_music_iterator::process (Moment until) { - bool had_good = false; - bool had_bad = false; SCM *proc = &children_list_; + bool finite = !pending_moment ().main_part_.is_infinity (); while (scm_is_pair (*proc)) { - Music_iterator *i = Music_iterator::unsmob (scm_car (*proc)); - bool run_always = i->run_always (); - if (run_always || i->pending_moment () == until) + Music_iterator *i = unsmob (scm_car (*proc)); + if (i->run_always () || i->pending_moment () == until) i->process (until); if (!i->ok ()) { - if (!run_always) - had_bad = true; i->quit (); *proc = scm_cdr (*proc); } else { - if (!run_always) - had_good = true; proc = SCM_CDRLOC (*proc); } } - // If there were non-run-always iterators and all of them died, take - // the rest of the run-always iterators along with them. They have + // If there were definite-ended iterators and all of them died, take + // the rest of the iterators along with them. They have // likely lost their reference iterators. Basing this on the actual // music contexts is not reliable since something like // \new Voice = blah { @@ -121,10 +118,10 @@ Simultaneous_music_iterator::process (Moment until) // } // cannot wait for the death of context blah before ending the // simultaneous iterator. - if (had_bad && !had_good) + if (finite && pending_moment ().main_part_.is_infinity ()) { for (SCM p = children_list_; scm_is_pair (p); p = scm_cdr (p)) - Music_iterator::unsmob (scm_car (p))->quit (); + unsmob (scm_car (p))->quit (); children_list_ = SCM_EOL; } } @@ -137,7 +134,7 @@ Simultaneous_music_iterator::pending_moment () const for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) { - Music_iterator *it = Music_iterator::unsmob (scm_car (s)); + Music_iterator *it = unsmob (scm_car (s)); next = min (next, it->pending_moment ()); } @@ -147,16 +144,13 @@ Simultaneous_music_iterator::pending_moment () const bool Simultaneous_music_iterator::ok () const { - bool run_always_ok = false; for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) { - Music_iterator *it = Music_iterator::unsmob (scm_car (s)); - if (!it->run_always ()) + Music_iterator *it = unsmob (scm_car (s)); + if (it->ok ()) return true; - else - run_always_ok = run_always_ok || it->ok (); } - return run_always_ok; + return false; } bool @@ -164,7 +158,7 @@ Simultaneous_music_iterator::run_always () const { for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) { - Music_iterator *it = Music_iterator::unsmob (scm_car (s)); + Music_iterator *it = unsmob (scm_car (s)); if (it->run_always ()) return true; } @@ -175,7 +169,7 @@ void Simultaneous_music_iterator::do_quit () { for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) - Music_iterator::unsmob (scm_car (s))->quit (); + unsmob (scm_car (s))->quit (); } IMPLEMENT_CTOR_CALLBACK (Simultaneous_music_iterator);