X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpart-combine-music-iterator.cc;h=b249224f3b368ed4da4d051daf2e0b8597b19e13;hb=9dd8f2b4e9efe7cd09bd5e2fa195dbc58b78f57f;hp=7a871bc815a26035d39eefeac5c344405d65a513;hpb=baf32731650d510882eeb52d02f4ca0c816c7c29;p=lilypond.git diff --git a/lily/part-combine-music-iterator.cc b/lily/part-combine-music-iterator.cc index 7a871bc815..b249224f3b 100644 --- a/lily/part-combine-music-iterator.cc +++ b/lily/part-combine-music-iterator.cc @@ -3,13 +3,12 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2002 Jan Nieuwenhuizen + (c) 2000--2003 Jan Nieuwenhuizen */ -#include "part-combine-music.hh" #include "part-combine-music-iterator.hh" #include "translator-group.hh" -#include "musical-request.hh" +#include "event.hh" #include "music-sequence.hh" #include "lily-guile.hh" #include "warn.hh" @@ -20,24 +19,47 @@ Part_combine_music_iterator::Part_combine_music_iterator () second_iter_ = 0; first_until_ = 0; second_until_ = 0; + state_ = 0; } -Part_combine_music_iterator::~Part_combine_music_iterator () +void +Part_combine_music_iterator::derived_mark () const +{ + if (first_iter_) + scm_gc_mark (first_iter_->self_scm()); + if (second_iter_) + scm_gc_mark(second_iter_->self_scm()); +} + +void +Part_combine_music_iterator::do_quit () { - delete second_iter_; - delete first_iter_; + if (first_iter_) + first_iter_->quit(); + if (second_iter_) + second_iter_->quit(); } Part_combine_music_iterator::Part_combine_music_iterator (Part_combine_music_iterator const &src) : Music_iterator (src) { - second_iter_ = src.second_iter_ ? src.second_iter_->clone () : 0; - first_iter_ = src.first_iter_ ? src.first_iter_->clone () : 0; + first_iter_ = 0; + second_iter_ = 0; + + if(src.first_iter_) + first_iter_ = src.first_iter_->clone (); + if (src.second_iter_) + second_iter_ = src.second_iter_->clone (); first_until_ = src.first_until_; second_until_ = src.second_until_; state_ = src.state_; suffix_ = src.suffix_; + + if (first_iter_) + scm_gc_unprotect_object (first_iter_->self_scm()); + if (second_iter_) + scm_gc_unprotect_object (second_iter_->self_scm()); } Moment @@ -59,13 +81,14 @@ Part_combine_music_iterator::ok () const return first_iter_->ok () || second_iter_->ok (); } + void Part_combine_music_iterator::construct_children () { - Part_combine_music const * m = dynamic_cast (get_music ()); - - first_iter_ = get_iterator (m->get_first ()); - second_iter_ = get_iterator (m->get_second ()); + SCM lst = get_music ()->get_mus_property ("elements"); + + first_iter_ = unsmob_iterator (get_iterator (unsmob_music (gh_car (lst)))); + second_iter_ = unsmob_iterator (get_iterator (unsmob_music (gh_cadr (lst)))); } void @@ -129,26 +152,22 @@ get_music_info (Moment m, Music_iterator* iter, SCM *pitches, SCM *durations) for (SCM i = iter->get_pending_events (m); gh_pair_p (i); i = ly_cdr (i)) { Music *m = unsmob_music (ly_car (i)); - if (Melodic_req *r = dynamic_cast (m)) - *pitches = gh_cons (r->get_mus_property ("pitch"), *pitches); - if (Rhythmic_req *r = dynamic_cast (m)) - { - SCM d = r->get_mus_property ("duration"); - if (d == SCM_EOL) - r->origin ()->warning ("Rhythmic_req has no duration\n"); - else - // *durations = gh_cons (r->get_mus_property ("duration"), *durations); - *durations = gh_cons (d, *durations); - } + SCM p = m->get_mus_property ("pitch"); + SCM d = m->get_mus_property ("duration"); + if (unsmob_pitch (p)) + *pitches = gh_cons (p, *pitches); + if (unsmob_duration (d)) + *durations = gh_cons (d, *durations); } } } - + int Part_combine_music_iterator::get_state (Moment) { int state = UNKNOWN; - Part_combine_music const *p = dynamic_cast (get_music ()); + + Music *p = get_music (); String w = ly_scm2string (p->get_mus_property ("what")); @@ -176,10 +195,11 @@ Part_combine_music_iterator::get_state (Moment) Moment second_mom = second_until_; Moment diff_until = diff_mom + now; + bool first = true; Music_iterator *first_iter = first_iter_->clone (); Music_iterator *second_iter = second_iter_->clone (); - + Moment last_pending (-1); Moment pending = now; while (now < diff_until @@ -208,10 +228,8 @@ Part_combine_music_iterator::get_state (Moment) if (first_pitches != SCM_EOL && second_pitches != SCM_EOL) { - scm_sort_list_x (first_pitches, - scm_primitive_eval (ly_symbol2scm ("Pitch::less_p"))); - scm_sort_list_x (second_pitches, - scm_primitive_eval (ly_symbol2scm ("Pitch::less_p"))); + scm_sort_list_x (first_pitches, Pitch::less_p_proc); + scm_sort_list_x (second_pitches, Pitch::less_p_proc); interval = gh_int2scm (unsmob_pitch (ly_car (first_pitches))->steps () - unsmob_pitch (ly_car (scm_last_pair (second_pitches)))->steps ()); @@ -220,15 +238,15 @@ Part_combine_music_iterator::get_state (Moment) if (first_durations != SCM_EOL) { scm_sort_list_x (first_durations, - scm_primitive_eval (ly_symbol2scm ("Duration::less_p"))); - first_mom += unsmob_duration (ly_car (first_durations))->length_mom (); + Duration::less_p_proc); + first_mom += unsmob_duration (ly_car (first_durations))->get_length (); } if (second_durations != SCM_EOL) { scm_sort_list_x (second_durations, - scm_primitive_eval (ly_symbol2scm ("Duration::less_p"))); - second_mom += unsmob_duration (ly_car (second_durations))->length_mom (); + Duration::less_p_proc); + second_mom += unsmob_duration (ly_car (second_durations))->get_length (); } if (first_pitches != SCM_EOL && second_pitches == SCM_EOL @@ -311,13 +329,14 @@ Part_combine_music_iterator::get_state (Moment) second_iter->skip (pending); now = pending; } - delete first_iter; - delete second_iter; + scm_gc_unprotect_object (first_iter->self_scm ()); + scm_gc_unprotect_object (second_iter->self_scm ()); } + return state; } -static Span_req* abort_req = NULL; +static Music* abort_req = NULL; void Part_combine_music_iterator::process (Moment m) @@ -331,7 +350,7 @@ Part_combine_music_iterator::process (Moment m) **** Tried this, but won't work: - Consider thread switching: threads "one", "two" and "both". +s Consider thread switching: threads "one", "two" and "both". User can't pre-set the (most important) stem direction at thread level! */ @@ -346,8 +365,7 @@ Part_combine_music_iterator::process (Moment m) else state = state_; - Part_combine_music const *p = - dynamic_cast (get_music ()); + Music *p =get_music (); bool previously_combined_b = first_iter_->report_to ()->daddy_trans_ @@ -368,8 +386,7 @@ Part_combine_music_iterator::process (Moment m) if (!abort_req) { - abort_req = new Span_req; - abort_req->set_mus_property ("span-type", scm_makfrom0str ("abort")); + abort_req = make_music_by_name (ly_symbol2scm ("AbortEvent")); } if (combine_b && combine_b != previously_combined_b)