]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/tie-performer.cc
Doc: edit comments basic-authors.texi - unneeded commas
[lilypond.git] / lily / tie-performer.cc
index 35d52ce0d4ed19ed9d9e842c7b501953fd1d6342..e6cb44de8f317a8fbe56a7e24e95d98354bceaa4 100644 (file)
@@ -1,9 +1,20 @@
 /*
-  tie-performer.cc -- implement Tie_performer
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
-  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "performer.hh"
 #include "context.hh"
 #include "stream-event.hh"
 #include "translator.icc"
+// #include "international.hh"
+#include <deque>
+
+struct Head_event_tuple
+{
+  Audio_element_info head_;
+  Moment moment_;
+  Head_event_tuple () { }
+  Head_event_tuple (Audio_element_info h, Moment m)
+  {
+    head_ = h;
+    moment_ = m;
+  }
+};
+
 
 class Tie_performer : public Performer
 {
   Stream_event *event_;
-  vector<Audio_element_info> now_heads_;
-  vector<Audio_element_info> now_tied_heads_;
-  vector<Audio_element_info> heads_to_tie_;
-
-  bool ties_created_;
+  // We don't really need a deque here. A vector would suffice. However,
+  // for some strange reason, using vectors always leads to memory 
+  // corruption in the STL templates! (i.e. after the first
+  // now_heads_.push_back (inf_mom), the now_heads_.size() will be 
+  // something like 3303820998 :(
+  deque<Head_event_tuple> now_heads_;
+  deque<Head_event_tuple> now_tied_heads_;
+  deque<Head_event_tuple> heads_to_tie_;
 
 protected:
   void stop_translation_timestep ();
@@ -35,7 +64,6 @@ public:
 Tie_performer::Tie_performer ()
 {
   event_ = 0;
-  ties_created_ = false;
 }
 
 IMPLEMENT_TRANSLATOR_LISTENER (Tie_performer, tie);
@@ -57,19 +85,22 @@ Tie_performer::acknowledge_audio_element (Audio_element_info inf)
 {
   if (Audio_note *an = dynamic_cast<Audio_note *> (inf.elem_))
     {
+//       message (_f ("acknowledge_audio_element, Size of now_heads_=%d", now_heads_.size ()));
+      Head_event_tuple inf_mom (inf, now_mom ());
       if (an->tie_event_)
-        now_tied_heads_.push_back (inf);
+        now_tied_heads_.push_back (inf_mom);
       else
-        now_heads_.push_back (inf);
+        now_heads_.push_back (inf_mom);
 
+//       message (_f ("acknowledge_audio_element, added, Size of now_heads_=%d", now_heads_.size ()));
       // Find a previous note that ties to the current note. If it exists, 
       // remove it from the heads_to_tie vector and create the tie
-      vector<Audio_element_info>::iterator it;
+      deque<Head_event_tuple>::iterator it;
       bool found = false;
       Stream_event *right_mus = inf.event_;
       for ( it = heads_to_tie_.begin() ; (!found) && (it < heads_to_tie_.end()); it++ )
         {
-         Audio_element_info et = *it;
+         Audio_element_info et = (*it).head_;
          Audio_note *th = dynamic_cast<Audio_note *> (et.elem_);
          Stream_event *left_mus = et.event_;
 
@@ -78,8 +109,8 @@ Tie_performer::acknowledge_audio_element (Audio_element_info inf)
                              left_mus->get_property ("pitch")))
            {
              found = true;
-             an->tie_to (th);
-             ties_created_ = true;
+             Moment skip = now_mom() - (*it).moment_ - th->length_mom_;
+             an->tie_to (th, skip);
              // this invalidates the iterator, we are leaving the loop anyway
              heads_to_tie_.erase (it);
            }
@@ -102,12 +133,12 @@ Tie_performer::stop_translation_timestep ()
   if (!to_boolean (get_property ("tieWaitForNote")))
     {
       heads_to_tie_.clear ();
-      ties_created_ = false;
     }
 
   if (event_)
     {
-      heads_to_tie_ = now_heads_;
+      for (vsize i = now_heads_.size (); i--;)
+        heads_to_tie_.push_back (now_heads_[i]);
     }
 
   for (vsize i = now_tied_heads_.size (); i--;)