]> git.donarmstrong.com Git - lilypond.git/blob - lily/recording-group-engraver.cc
25f5392172f314b0050501312b181f8538592303
[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 (gh_cons (now_mom (). smobbed_copy (), SCM_EOL),
31                           SCM_EOL);
32 }
33
34 Recording_group_engraver::Recording_group_engraver()
35 {
36 }
37
38 void
39 Recording_group_engraver::start_translation_timestep ()
40 {
41   Engraver_group_engraver::start_translation_timestep();
42
43
44   /*
45     We have to do this both in initialize() and
46     start_translation_timestep(), since start_translation_timestep()
47     isn't called on the first time-step.g
48    */
49   if (!gh_pair_p (gh_car (accumulator_)))
50     scm_set_car_x (accumulator_, gh_cons (now_mom ().smobbed_copy (), SCM_EOL));
51 }
52
53 void
54 Recording_group_engraver::stop_translation_timestep ()
55 {
56   Engraver_group_engraver::stop_translation_timestep();
57   scm_set_cdr_x (accumulator_, gh_cons (gh_car (accumulator_), gh_cdr (accumulator_)));
58
59   scm_set_car_x (accumulator_, SCM_EOL);
60 }
61
62 void
63 Recording_group_engraver::finalize ()
64 {
65   Engraver_group_engraver::finalize ();
66   SCM proc = get_property ("recordEventSequence");
67
68   if (gh_procedure_p (proc))
69     scm_call_2  (proc, daddy_context_->self_scm(), gh_cdr (accumulator_));
70
71   accumulator_ = SCM_EOL;
72 }
73
74 bool
75 Recording_group_engraver::try_music (Music  *m)
76 {
77   bool retval = Translator_group::try_music (m);
78
79   SCM seq = gh_cdar (accumulator_);
80   seq = gh_cons (gh_cons  (m->self_scm(), gh_bool2scm (retval)),
81                  seq);
82   
83   scm_set_cdr_x  (gh_car (accumulator_), seq);
84
85   return retval;
86 }
87
88
89 ENTER_DESCRIPTION(Recording_group_engraver,
90                   "Engraver_group_engraver that records all music events "
91                   "for this context. Calls the procedure "
92                   "in @code{recordEventSequence} when finished.",
93                   "",
94                   "",
95                   "",
96                   "recordEventSequence",
97                   "");