]> git.donarmstrong.com Git - lilypond.git/commitdiff
Plug MIDI memory leak, and correct end-of-track issues.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 22 Jan 2007 17:30:48 +0000 (18:30 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 22 Jan 2007 17:30:48 +0000 (18:30 +0100)
Centralize midi item memory management.  Don't do side-effects in
destructor, but in explicit finalize() method.

Conflicts:

lily/include/midi-walker.hh
lily/midi-walker.cc

lily/accidental-placement.cc
lily/audio-staff.cc
lily/include/midi-item.hh
lily/include/midi-walker.hh
lily/midi-item.cc
lily/midi-walker.cc

index c55cb6fd9c3f42a85aceac578a1485ff42411e8d..8251551f77b872a923e1285729cae8de2366a3b8 100644 (file)
@@ -427,9 +427,9 @@ Accidental_placement::calc_positioning_done (SCM smob)
   me->flush_extent_cache (X_AXIS);
   me->set_property ("X-extent", scm_width);
 
-  for (vsize i = apes.size (); i--;)
-    delete apes[i];
-
+  junk_pointers (apes);
+  delete head_ape;
+  
   return SCM_BOOL_T;
 }
 
index 1616ceb3c83cb9354f6c3226b194948f792f43d5..ec07ed81eeba1c770af7d5b70c1a244540b76255 100644 (file)
@@ -28,9 +28,11 @@ Audio_staff::output (Midi_stream &midi_stream, int channel)
 {
   Midi_track midi_track;
   midi_track.number_ = channel;
-  
-  for (Midi_walker i (this, &midi_track, channel); i.ok (); i++)
+  Midi_walker i (this, &midi_track, channel);
+  for (; i.ok (); i++)
     i.process ();
+
+  i.finalize ();
   
   midi_stream << midi_track;
 }
index b48049b952512809d9a7a0ad99d3ea24dee6d6e8..fe5be590450f95f7f9bdd76a17035090ed1214c1 100644 (file)
@@ -23,7 +23,6 @@ public:
   virtual ~Midi_item ();
   virtual char const *name () const;
 
-  /// factory
   static Midi_item *get_midi (Audio_item *a);
 
   static string i2varint_string (int i);
index cb75744a92350d566ca3440261a4500e3c0053eb..7d56a47c717eb928934fc784417325e858b8e25d 100644 (file)
@@ -33,12 +33,12 @@ public:
   void process ();
   void operator ++ (int);
   bool ok () const;
-
+  void finalize ();
 private:
   void do_start_note (Midi_note *note);
   void do_stop_notes (int);
   void output_event (int, Midi_item *l);
-
+  Midi_item *get_midi (Audio_item*); 
   int channel_;
   Midi_track *track_;
   Audio_staff *staff_;
@@ -46,6 +46,8 @@ private:
   vector<Audio_item*> items_;
   PQueue<Midi_note_event> stop_note_queue;
   int last_tick_;
+
+  vector<Midi_item*> midi_events_;
 };
 
 #endif // MIDI_WALKER_HH
index 69916c74ce4b9106c4729b5834519c1a657207cf..b69c1348193aeb319e82b6ad87e0fb099c11bf8b 100644 (file)
@@ -483,5 +483,4 @@ Midi_item::name () const
 
 Midi_track::~Midi_track ()
 {
-  junk_pointers (events_);
 }
index d87fb557a2ceb1637f71db56f6ce4d68f398a222..6dce3c9ee982fb6dabaf671ae18022af680723b4 100644 (file)
@@ -53,7 +53,13 @@ Midi_walker::Midi_walker (Audio_staff *audio_staff, Midi_track *track,
 
 Midi_walker::~Midi_walker ()
 {
-  do_stop_notes (last_tick_ + 384);
+  junk_pointers (midi_events_);
+}
+
+void
+Midi_walker::finalize ()
+{
+  do_stop_notes (INT_MAX);
 }
 
 /**
@@ -85,7 +91,6 @@ Midi_walker::do_start_note (Midi_note *note)
            {
              /* skip this stopnote,
                 don't play the start note */
-             delete note;
              note = 0;
              break;
            }
@@ -115,7 +120,6 @@ Midi_walker::do_stop_notes (int max_ticks)
       Midi_note_event e = stop_note_queue.get ();
       if (e.ignore_b_)
        {
-         delete e.val;
          continue;
        }
 
@@ -154,7 +158,7 @@ Midi_walker::process ()
   Audio_item *audio = items_[index_];
   do_stop_notes (audio->audio_column_->ticks ());
 
-  if (Midi_item *midi = Midi_item::get_midi (audio))
+  if (Midi_item *midi = get_midi (audio))
     {
       if (Midi_channel_item *mci = dynamic_cast<Midi_channel_item*> (midi))
        mci->channel_ = channel_;
@@ -170,6 +174,14 @@ Midi_walker::process ()
     }
 }
 
+Midi_item*
+Midi_walker::get_midi (Audio_item *i)
+{
+  Midi_item *mi = Midi_item::get_midi (i);
+  midi_events_.push_back (mi);
+  return mi;
+}
+
 bool
 Midi_walker::ok () const
 {