]> git.donarmstrong.com Git - lilypond.git/blob - lily/recording-group-engraver.cc
(find_create_context): go to Score if it exists.
[lilypond.git] / lily / recording-group-engraver.cc
1 /*   
2   recording-group-engraver.cc -- implement Recording_group_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2003--2004 Han-Wen Nienhuys <hanwen@xs4all.nl>
7
8  */
9
10 #include "context.hh"
11 #include "engraver-group-engraver.hh"
12 #include "protected-scm.hh"
13
14 class Recording_group_engraver : public Engraver_group_engraver
15 {
16 public:
17   TRANSLATOR_DECLARATIONS(Recording_group_engraver);
18   virtual bool try_music (Music *m);
19   virtual void start_translation_timestep ();
20   virtual void stop_translation_timestep ();
21   virtual void finalize ();
22   virtual void initialize ();
23   Protected_scm accumulator_;
24 };
25
26 void
27 Recording_group_engraver::initialize ()
28 {
29   Engraver_group_engraver::initialize ();
30   accumulator_ = gh_cons (SCM_EOL, SCM_EOL);
31 }
32
33 Recording_group_engraver::Recording_group_engraver()
34 {
35 }
36
37 void
38 Recording_group_engraver::start_translation_timestep ()
39 {
40   Engraver_group_engraver::start_translation_timestep();
41   
42   scm_set_car_x (accumulator_, gh_cons (now_mom ().smobbed_copy (), SCM_EOL));
43 }
44
45 void
46 Recording_group_engraver::stop_translation_timestep ()
47 {
48   Engraver_group_engraver::stop_translation_timestep();
49   scm_set_cdr_x (accumulator_, gh_cons (gh_car (accumulator_), gh_cdr (accumulator_)));
50
51   scm_set_car_x (accumulator_, SCM_EOL);
52 }
53
54 void
55 Recording_group_engraver::finalize ()
56 {
57   Engraver_group_engraver::finalize ();
58   SCM proc = get_property ("recordEventSequence");
59
60   if (gh_procedure_p (proc))
61     scm_call_2  (proc, daddy_context_->self_scm(), gh_cdr (accumulator_));
62
63   accumulator_ = SCM_EOL;
64 }
65
66 bool
67 Recording_group_engraver::try_music (Music  *m)
68 {
69   bool retval = Translator_group::try_music (m);
70
71   SCM seq = gh_cdar (accumulator_);
72   seq = gh_cons (gh_cons  (m->self_scm(), gh_bool2scm (retval)),
73                  seq);
74   
75   scm_set_cdr_x  (gh_car (accumulator_), seq);
76
77   return retval;
78 }
79
80
81 ENTER_DESCRIPTION(Recording_group_engraver,
82                   "Engraver_group_engraver that records all music events "
83                   "for this context. Calls the procedure "
84                   "in @code{recordEventSequence} when finished.",
85                   "",
86                   "",
87                   "",
88                   "recordEventSequence",
89                   "");