X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpart-combine-iterator.cc;h=83944b9ddfb3afe988c461d50f72a0e632b13503;hb=d02dcdc4042a592a52bc977ad4fb28a5d841e733;hp=9f06f3821f10ae5f0ba35670e46e7c35ab9f8dd5;hpb=5357d84829e4baaf4419409d4f5c10c87cacdd03;p=lilypond.git diff --git a/lily/part-combine-iterator.cc b/lily/part-combine-iterator.cc index 9f06f3821f..83944b9ddf 100644 --- a/lily/part-combine-iterator.cc +++ b/lily/part-combine-iterator.cc @@ -1,15 +1,25 @@ /* - new-part-combine-music-iterator.cc -- implement Part_combine_iterator + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2004--2010 Han-Wen Nienhuys - (c) 2004--2006 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "context.hh" #include "dispatcher.hh" #include "lily-guile.hh" -#include "listener.hh" #include "music.hh" #include "music-iterator.hh" #include "music-sequence.hh" @@ -34,7 +44,6 @@ public: protected: virtual void derived_substitute (Context *f, Context *t); virtual void derived_mark () const; - Part_combine_iterator (Part_combine_iterator const &); virtual void construct_children (); virtual Moment pending_moment () const; @@ -57,6 +66,11 @@ private: SCM split_list_; + Stream_event *unisono_event_; + Stream_event *solo_one_event_; + Stream_event *solo_two_event_; + Stream_event *mmrest_event_; + enum Status { APART, @@ -111,6 +125,11 @@ Part_combine_iterator::do_quit () Part_combine_iterator::Part_combine_iterator () { + mmrest_event_ = 0; + unisono_event_ = 0; + solo_two_event_ = 0; + solo_one_event_= 0; + first_iter_ = 0; second_iter_ = 0; split_list_ = SCM_EOL; @@ -125,6 +144,17 @@ Part_combine_iterator::derived_mark () const scm_gc_mark (first_iter_->self_scm ()); if (second_iter_) scm_gc_mark (second_iter_->self_scm ()); + + Stream_event *ptrs[] = { + unisono_event_, + mmrest_event_, + solo_two_event_, + solo_one_event_, + 0 + }; + for (int i = 0; ptrs[i]; i++) + if (ptrs[i]) + scm_gc_mark (ptrs[i]->self_scm ()); } void @@ -171,14 +201,15 @@ Part_combine_iterator::chords_together () void Part_combine_iterator::kill_mmrest (int in) { - static Stream_event *mmrest; - if (!mmrest) + + if (!mmrest_event_) { - mmrest = new Stream_event (ly_symbol2scm ("multi-measure-rest-event")); - mmrest->set_property ("duration", SCM_EOL); + mmrest_event_ = new Stream_event (ly_symbol2scm ("multi-measure-rest-event")); + mmrest_event_->set_property ("duration", SCM_EOL); + mmrest_event_->unprotect (); } - handles_[in].get_outlet ()->event_source ()->broadcast (mmrest); + handles_[in].get_outlet ()->event_source ()->broadcast (mmrest_event_); } void @@ -196,11 +227,13 @@ Part_combine_iterator::solo1 () if (playing_state_ != SOLO1) { - static Stream_event *event; - if (!event) - event = new Stream_event (ly_symbol2scm ("solo-one-event")); + if (!solo_one_event_) + { + solo_one_event_ = new Stream_event (ly_symbol2scm ("solo-one-event")); + solo_one_event_->unprotect (); + } - first_iter_->get_outlet ()->event_source ()->broadcast (event); + first_iter_->get_outlet ()->event_source ()->broadcast (solo_one_event_); } playing_state_ = SOLO1; } @@ -252,14 +285,16 @@ Part_combine_iterator::unisono (bool silent) if (playing_state_ != UNISONO && newstate == UNISONO) { - static Stream_event *event; - if (!event) - event = new Stream_event (ly_symbol2scm ("unisono-event")); - + if (!unisono_event_) + { + unisono_event_ = new Stream_event (ly_symbol2scm ("unisono-event")); + unisono_event_->unprotect (); + } + Context *out = (last_playing_ == SOLO2 ? second_iter_ : first_iter_) ->get_outlet (); - out->event_source ()->broadcast (event); + out->event_source ()->broadcast (unisono_event_); playing_state_ = UNISONO; } state_ = newstate; @@ -279,11 +314,13 @@ Part_combine_iterator::solo2 () if (playing_state_ != SOLO2) { - static Stream_event *event; - if (!event) - event = new Stream_event (ly_symbol2scm ("solo-two-event")); - - second_iter_->get_outlet ()->event_source ()->broadcast (event); + if (!solo_two_event_) + { + solo_two_event_ = new Stream_event (ly_symbol2scm ("solo-two-event")); + solo_two_event_->unprotect (); + } + + second_iter_->get_outlet ()->event_source ()->broadcast (solo_two_event_); playing_state_ = SOLO2; } } @@ -368,7 +405,8 @@ Part_combine_iterator::set_busy (SCM se) } /* -* Processes a moment in an iterator, and returns whether any new music was reported. + Processes a moment in an iterator, and returns whether any new music + was reported. */ bool Part_combine_iterator::try_process (Music_iterator *i, Moment m)