X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpart-combine-iterator.cc;h=03da0d4f5714fcd67dbc9257cccdef9b81c02f2a;hb=7785ac382ed511ed535adf77adc3c07649fbc9b5;hp=2a85da80375a877b3d7fb4990c487cbc7b6fac4f;hpb=abbdb46061be5c0a0682059d1f86bf3e44ca5cf3;p=lilypond.git diff --git a/lily/part-combine-iterator.cc b/lily/part-combine-iterator.cc index 2a85da8037..03da0d4f57 100644 --- a/lily/part-combine-iterator.cc +++ b/lily/part-combine-iterator.cc @@ -17,7 +17,9 @@ typedef enum Outlet_type { - CONTEXT_ONE, CONTEXT_TWO, CONTEXT_SHARED, CONTEXT_SOLO, CONTEXT_NULL, NUM_OUTLETS + CONTEXT_ONE, CONTEXT_TWO, + CONTEXT_SHARED, CONTEXT_SOLO, + CONTEXT_NULL, NUM_OUTLETS }; static const char *outlet_names_[NUM_OUTLETS] = @@ -32,7 +34,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; @@ -55,6 +56,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, @@ -109,6 +115,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; @@ -123,6 +134,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 @@ -169,14 +191,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 @@ -194,11 +217,13 @@ Part_combine_iterator::solo1 () if (playing_state_ != SOLO1) { - static Stream_event *event; - if (!event) - event = new Stream_event (ly_symbol2scm ("solo1-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; } @@ -250,14 +275,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; @@ -277,11 +304,13 @@ Part_combine_iterator::solo2 () if (playing_state_ != SOLO2) { - static Stream_event *event; - if (!event) - event = new Stream_event (ly_symbol2scm ("solo2-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; } } @@ -366,7 +395,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)