X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fperformer-group-performer.cc;h=053a5f32fce04e61dc2fabdeff25d6e3e6ded9fa;hb=39a23d0f6910fd0359655518ce05ad0f6bc5f73f;hp=266912313336a07ae012412d1883a10335a62fa4;hpb=1a66290a98e7de8d6d41485b5b71a9f7e1fe35c7;p=lilypond.git diff --git a/lily/performer-group-performer.cc b/lily/performer-group-performer.cc index 2669123133..053a5f32fc 100644 --- a/lily/performer-group-performer.cc +++ b/lily/performer-group-performer.cc @@ -3,165 +3,80 @@ source file of the GNU LilyPond music typesetter - (c) 1996, 1997 Han-Wen Nienhuys - Jan Nieuwenhuizen - */ + (c) 1996--2005 Han-Wen Nienhuys + Jan Nieuwenhuizen +*/ #include "performer-group-performer.hh" -#include "input-translator.hh" -#include "debug.hh" -IMPLEMENT_IS_TYPE_B2(Performer_group_performer,Performer, Translator); -ADD_THIS_PERFORMER(Performer_group_performer); +#include "context.hh" +#include "audio-element.hh" +#include "warn.hh" -Performer_group_performer::~Performer_group_performer() -{ - -} +ADD_TRANSLATOR (Performer_group_performer, + /* descr */ "", + /* creats*/ "", + /* accepts */ "", + /* acks */ "", + /* reads */ "", + /* write */ ""); void -Performer_group_performer::add (Performer *perf_p) -{ - perf_p_list_.bottom().add (perf_p); - perf_p->daddy_perf_l_ = this; - - if (perf_p->is_type_b (Performer_group_performer::static_name())) { - group_l_arr_.push ((Performer_group_performer*)perf_p); - } else { - nongroup_l_arr_ .push (perf_p); - } -} - -Translator* -Performer_group_performer::ancestor_l (int l) +Performer_group_performer::announce_element (Audio_element_info info) { - if (!l || !daddy_perf_l_) - return this; - - return daddy_perf_l_->ancestor_l (l - 1); -} + announce_infos_.push (info); + Translator *t + = context ()->get_parent_context ()->implementation (); -int -Performer_group_performer::depth_i() const -{ - return daddy_perf_l_->depth_i() + 1; + if (Performer_group_performer *eg = dynamic_cast (t)) + eg->announce_element (info); } void -Performer_group_performer::do_creation_processing() +Performer_group_performer::acknowledge_audio_elements () { - for ( PCursor i (perf_p_list_.top()); i.ok (); i++ ) - i->creation_processing(); -} - -void -Performer_group_performer::do_print()const -{ -#ifndef NPRINT - if ( !check_debug) - return ; - for ( PCursor i (perf_p_list_.top()); i.ok (); i++ ) - i->print(); -#endif -} - -void -Performer_group_performer::do_removal_processing() -{ - for ( PCursor i (perf_p_list_.top()); i.ok (); i++ ) - i->do_removal_processing(); -} - -bool -Performer_group_performer::do_try_request (Request* req_l) -{ - bool hebbes_b =false; - for (int i =0; !hebbes_b && i < nongroup_l_arr_.size() ; i++) - hebbes_b =nongroup_l_arr_[i]->try_request (req_l); - if ( !hebbes_b && daddy_perf_l_) - hebbes_b = daddy_perf_l_->try_request (req_l); - return hebbes_b ; -} - -Translator* -Performer_group_performer::find_get_translator_l (String n,String id) -{ - Translator * ret=0; - Input_translator* itrans_l= itrans_l_-> recursive_find ( n); - if (itrans_l) { - ret = find_performer_l (n,id); - if (!ret) { - Performer_group_performer * group = - itrans_l-> get_group_performer_p(); - - add (group); - ret = group; - - if (group->itrans_l_->is_name_b (n) ) - ret ->id_str_ = id; - else - return ret->find_get_translator_l (n,id); - + for (int j = 0; j < announce_infos_.size (); j++) + { + Audio_element_info info = announce_infos_[j]; + + for (SCM p = get_simple_trans_list (); scm_is_pair (p); p = scm_cdr (p)) + { + Translator *t = unsmob_translator (scm_car (p)); + Performer *eng = dynamic_cast (t); + if (eng && eng != info.origin_trans_) + eng->acknowledge_audio_element (info); } - } else if (daddy_perf_l_) - ret =daddy_perf_l_->find_get_translator_l (n,id); - else { - warning ("Can't find or create `" + n + "' called `" + id + "'\n"); - ret =0; } - return ret; } -Performer_group_performer* -Performer_group_performer::find_performer_l (String n, String id) +void +Performer_group_performer::do_announces () { - if (name() == n && id_str_ == id) - return this; - Performer_group_performer * r = 0; - for (int i =0; !r && i< group_l_arr_.size(); i++) { - r = group_l_arr_[i]->find_performer_l (n,id); - } - - return r; -} + while (1) + { + create_audio_elements (); + performer_each (get_simple_trans_list (), + &Performer::create_audio_elements); -Translator* -Performer_group_performer::get_default_interpreter() -{ - // ? - if ( is_bottom_performer_b()) - return daddy_perf_l_->get_default_interpreter(); + if (!announce_infos_.size ()) + break; - Performer_group_performer *perf_p= itrans_l_-> - get_default_itrans_l()->get_group_performer_p (); - add (perf_p); - if (perf_p->is_bottom_performer_b()) - return perf_p; - else - return perf_p->get_default_interpreter(); + acknowledge_audio_elements (); + announce_infos_.clear (); + } } -bool -Performer_group_performer::is_bottom_performer_b() const +Performer_group_performer::Performer_group_performer () { - return !itrans_l_->get_default_itrans_l(); -} - -void -Performer_group_performer::print() const -{ - Performer::print(); } void -Performer_group_performer::process_requests() +performer_each (SCM list, Performer_method method) { - for ( PCursor i (perf_p_list_.top()); i.ok (); i++ ) - i->process_requests(); -} - -bool -Performer_group_performer::try_request (Request* r) -{ - return Performer::try_request (r); + for (SCM p = list; scm_is_pair (p); p = scm_cdr (p)) + { + Performer *e = dynamic_cast (unsmob_translator (scm_car (p))); + if (e) + (e->*method) (); + } }