new function; construct simple_trans_list_ lazily.
+2004-01-10 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+ * lily/translator-group.cc (get_simple_trans_list):
+ new function; construct simple_trans_list_ lazily.
+
2004-01-10 Jan Nieuwenhuizen <janneke@gnu.org>
* lily/paper-outputter.cc (output_scope): Check if number before
MAJOR_VERSION=2
MINOR_VERSION=1
PATCH_LEVEL=8
-MY_PATCH_LEVEL=
+MY_PATCH_LEVEL=hwn1
set_property_on_children (Translator_group * trans, const char * sym, SCM val)
{
trans->set_property (sym, val);
- for (SCM p = trans -> trans_group_list_; gh_pair_p (p); p = ly_cdr(p)) {
+ for (SCM p = trans->trans_group_list_; gh_pair_p (p); p = ly_cdr(p)) {
Translator_group *trg = dynamic_cast<Translator_group*> (unsmob_translator (ly_car (p)));
set_property_on_children(trg,sym,ly_deep_copy(val));
}
void
Engraver_group_engraver::process_acknowledged_grobs_in_simple_children ()
{
- for (SCM p = simple_trans_list_; gh_pair_p (p); p = ly_cdr (p))
+ for (SCM p = get_simple_trans_list (); gh_pair_p (p); p = ly_cdr (p))
{
Translator * t = unsmob_translator (ly_car (p));
Engraver * eng = dynamic_cast<Engraver*> (t);
SCM acklist = scm_hashq_ref (tab, nm, SCM_UNDEFINED);
if (acklist == SCM_BOOL_F)
{
- acklist= find_acknowledge_engravers (gh_cons (self_scm (), simple_trans_list_), meta);
+ acklist = find_acknowledge_engravers (gh_cons (self_scm (), get_simple_trans_list ()), meta);
scm_hashq_set_x (tab, nm, acklist);
}
void
Engraver_group_engraver::process_music ()
{
- for (SCM p = simple_trans_list_; gh_pair_p (p); p =ly_cdr (p))
+ for (SCM p = get_simple_trans_list (); gh_pair_p (p); p =ly_cdr (p))
{
Translator * t = unsmob_translator (ly_car (p));
Engraver * eng = dynamic_cast<Engraver*> (t);
void
Grob_pq_engraver::start_translation_timestep ()
{
- Moment now = now_mom();
+ Moment now = now_mom();
SCM start_busy = get_property ("busyGrobs");
SCM busy = start_busy;
protected:
~Translator_group ();
+ virtual SCM get_simple_trans_list ();
public:
void execute_pushpop_property (SCM prop, SCM sym, SCM val);
SCM internal_get_property (SCM name_sym) const;
virtual Moment now_mom () const;
/*
- ugh: bubbled up from Translator_group.
+ ugh: bubbled up.
*/
- SCM simple_trans_list_;
- SCM trans_group_list_;
SCM definition_;
SCM properties_scm_;
+ SCM trans_group_list_;
+
+ virtual SCM get_simple_trans_list ();
+public:
DECLARE_SMOBS (Translator, dummy);
+private:
+ /*
+ ugh: bubbled up from Translator_group.
+ */
+
+protected: // should be private.
+ SCM simple_trans_list_;
+
+ // ugr.
+ // friend SCM Translator_group::get_simple_trans_list ();
public:
TRANSLATOR_DECLARATIONS(Note_heads_engraver);
protected:
- virtual void start_translation_timestep ();
virtual bool try_music (Music *req) ;
virtual void process_music ();
note_reqs_.clear ();
}
-void
-Note_heads_engraver::start_translation_timestep ()
-{
-}
ENTER_DESCRIPTION(Note_heads_engraver,
void
Performer_group_performer::create_audio_elements ()
{
- for (SCM p = simple_trans_list_; gh_pair_p (p); p = ly_cdr (p))
+ for (SCM p = get_simple_trans_list (); gh_pair_p (p); p = ly_cdr (p))
{
Translator * t = unsmob_translator (ly_car (p));
Performer * eng = dynamic_cast<Performer*> (t);
{
Audio_element_info info = announce_infos_[j];
- for (SCM p = simple_trans_list_; gh_pair_p (p); p = ly_cdr (p))
+ for (SCM p = get_simple_trans_list (); gh_pair_p (p); p = ly_cdr (p))
{
Translator * t = unsmob_translator (ly_car (p));
Performer * eng = dynamic_cast<Performer*> (t);
check_removal ();
finalize ();
-
}
/*
void
Timing_translator::initialize ()
{
+
+ /*
+ move this to engraver-init.ly?
+ */
+
daddy_trans_->set_property ("timing" , SCM_BOOL_T);
daddy_trans_->set_property ("currentBarNumber" , gh_int2scm (1));
IMPLEMENT_DEFAULT_EQUAL_P (Translator_def);
-static SCM
-names_to_translators (SCM namelist, Translator_group*tg)
-{
- SCM l = SCM_EOL;
- for (SCM s = namelist; gh_pair_p (s) ; s = ly_cdr (s))
- {
- Translator * t = get_translator (ly_car (s));
- if (!t)
- warning (_f ("can't find: `%s'", s));
- else
- {
- Translator * tr = t->clone ();
- SCM str = tr->self_scm ();
- l = gh_cons (str, l);
-
- tr->daddy_trans_ = tg;
- tr->output_def_ = tg->output_def_;
-
- scm_gc_unprotect_object (str);
- }
- }
- return l;
-}
SCM
tg->output_def_ = md;
tg->definition_ = self_scm ();
- SCM trans_names = get_translator_names (ops);
- tg->simple_trans_list_ = names_to_translators (trans_names, tg);
-
return tg;
}
+
SCM
Translator_def::clone_scm () const
{
void
Translator_group::each (Method_pointer method)
{
- static_each (simple_trans_list_, method);
+ static_each (get_simple_trans_list (), method);
static_each (trans_group_list_, method);
}
{
SCM tab = scm_make_vector (gh_int2scm (19), SCM_BOOL_F);
set_property ("acceptHashTable", tab);
- each (&Translator::initialize);
+ static_each (trans_group_list_, &Translator::initialize);
}
void
each (&Translator::finalize);
}
-
-
-bool translator_accepts_any_of (Translator*tr, SCM ifaces)
+bool
+translator_accepts_any_of (Translator*tr, SCM ifaces)
{
SCM ack_ifs = scm_assoc (ly_symbol2scm ("events-accepted"),
tr->translator_description());
SCM accept_list = scm_hashq_ref (tab, name, SCM_UNDEFINED);
if (accept_list == SCM_BOOL_F)
{
- accept_list = find_accept_translators (simple_trans_list_,
+ accept_list = find_accept_translators (get_simple_trans_list (),
m->get_mus_property ("types"));
scm_hashq_set_x (tab, name, accept_list);
}
}
}
}
+
+SCM
+names_to_translators (SCM namelist, Translator_group*tg)
+{
+ SCM l = SCM_EOL;
+ for (SCM s = namelist; gh_pair_p (s) ; s = ly_cdr (s))
+ {
+ Translator * t = get_translator (ly_car (s));
+ if (!t)
+ warning (_f ("can't find: `%s'", s));
+ else
+ {
+ Translator * tr = t->clone ();
+ SCM str = tr->self_scm ();
+ l = gh_cons (str, l);
+
+ tr->daddy_trans_ = tg;
+ tr->output_def_ = tg->output_def_;
+
+ scm_gc_unprotect_object (str);
+ }
+ }
+ return l;
+}
+
+
+SCM
+Translator_group::get_simple_trans_list ()
+{
+ if (simple_trans_list_ != SCM_BOOL_F)
+ return simple_trans_list_;
+
+ Translator_def * td = unsmob_translator_def (definition_);
+
+ /*
+ The following cannot work, since start_translation_timestep ()
+ triggers this code, and start_translation_timestep happens before
+ \property Voice.Voice =#'()
+
+ */
+ SCM trans_names = internal_get_property (td->get_context_name ());
+ if (!gh_pair_p (trans_names))
+ {
+ trans_names = td->get_translator_names (SCM_EOL);
+ }
+
+ simple_trans_list_ = names_to_translators (trans_names, this);
+
+
+ static_each (simple_trans_list_, &Translator::initialize);
+ return simple_trans_list_;
+}
void
Translator::init ()
{
- simple_trans_list_ = SCM_EOL;
+ simple_trans_list_ = SCM_BOOL_F;
trans_group_list_ = SCM_EOL;
properties_scm_ = SCM_EOL;
definition_ = SCM_EOL;
IMPLEMENT_DEFAULT_EQUAL_P (Translator);
IMPLEMENT_TYPE_P(Translator,"ly:translator?");
+SCM
+Translator::get_simple_trans_list()
+{
+ return SCM_EOL;
+}
(AbsoluteDynamicEvent
. (
(description . "Creates a dynamic mark. Syntax: @var{note}@code{\\x},
-where x is one of \\@\\{\\ppp, \\pp, \\p, \\mp, \\mf, \\f, \\ff, \\fff.\\@\\}")
+where x is one of \\ppp, \\pp, \\p, \\mp, \\mf, \\f, \\ff, \\fff.")
(internal-class-name . "Event")
(types . (general-music event dynamic-event absolute-dynamic-event))
))