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

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

index 120313ef6455c2505e7af243992a8960590eb1df..bd7edf554409420818b3f83727799b0258995584 100644 (file)
@@ -32,6 +32,8 @@ Audio_staff::output (Midi_stream &midi_stream, int channel)
   Midi_walker i (this, &midi_track, channel);
   for (; i.ok (); i++)
     i.process ();
+
+  i.finalize ();
   
   midi_stream.write (midi_track);
 }
index f7ea0e0585c07cce1551692ef714b1b78660bb7d..a03532694f5d52dad1349c42952996445bc1b75a 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 69bf4c8a9b939589e41caf9fa62cc2390cd174a3..8ea8b27b6442b73829c9b68f9e4d2b8a862e11f5 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_;
@@ -47,6 +47,7 @@ private:
   PQueue<Midi_note_event> stop_note_queue;
   int last_tick_;
 
+  vector<Midi_item*> midi_events_;
 };
 
 #endif // MIDI_WALKER_HH
index 88f9aeb86f0525a8788ce7490f1d0799bf3dc96d..4a633cc79df4ed56836b20021974158cbb805138 100644 (file)
@@ -466,5 +466,4 @@ Midi_item::name () const
 
 Midi_track::~Midi_track ()
 {
-  junk_pointers (events_);
 }
index 941e64c282932e753a97c1aa494327d339929ef8..c9a1fc2839587659ec64c1029f001f205871de61 100644 (file)
@@ -53,9 +53,14 @@ Midi_walker::Midi_walker (Audio_staff *audio_staff, Midi_track *track,
 
 Midi_walker::~Midi_walker ()
 {
-  do_stop_notes (INT_MAX);
+  junk_pointers (midi_events_);
 }
 
+void
+Midi_walker::finalize ()
+{
+  do_stop_notes (INT_MAX);
+}
 
 /**
    Find out if start_note event is needed, and do it if needed.
@@ -88,7 +93,6 @@ Midi_walker::do_start_note (Midi_note *note)
            {
              /* skip this stopnote,
                 don't play the start note */
-             delete note;
              note = 0;
              break;
            }
@@ -118,7 +122,6 @@ Midi_walker::do_stop_notes (int max_ticks)
       Midi_note_event e = stop_note_queue.get ();
       if (e.ignore_)
        {
-         delete e.val;
          continue;
        }
 
@@ -154,7 +157,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_;
@@ -169,6 +172,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
 {