From a4226376d84b665ff37dbb636a5ad60c1a34665b Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Mon, 22 Jan 2007 18:30:48 +0100 Subject: [PATCH] Plug MIDI memory leak, and correct end-of-track issues. 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 | 6 +++--- lily/audio-staff.cc | 6 ++++-- lily/include/midi-item.hh | 1 - lily/include/midi-walker.hh | 6 ++++-- lily/midi-item.cc | 1 - lily/midi-walker.cc | 20 ++++++++++++++++---- 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/lily/accidental-placement.cc b/lily/accidental-placement.cc index c55cb6fd9c..8251551f77 100644 --- a/lily/accidental-placement.cc +++ b/lily/accidental-placement.cc @@ -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; } diff --git a/lily/audio-staff.cc b/lily/audio-staff.cc index 1616ceb3c8..ec07ed81ee 100644 --- a/lily/audio-staff.cc +++ b/lily/audio-staff.cc @@ -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; } diff --git a/lily/include/midi-item.hh b/lily/include/midi-item.hh index b48049b952..fe5be59045 100644 --- a/lily/include/midi-item.hh +++ b/lily/include/midi-item.hh @@ -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); diff --git a/lily/include/midi-walker.hh b/lily/include/midi-walker.hh index cb75744a92..7d56a47c71 100644 --- a/lily/include/midi-walker.hh +++ b/lily/include/midi-walker.hh @@ -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 items_; PQueue stop_note_queue; int last_tick_; + + vector midi_events_; }; #endif // MIDI_WALKER_HH diff --git a/lily/midi-item.cc b/lily/midi-item.cc index 69916c74ce..b69c134819 100644 --- a/lily/midi-item.cc +++ b/lily/midi-item.cc @@ -483,5 +483,4 @@ Midi_item::name () const Midi_track::~Midi_track () { - junk_pointers (events_); } diff --git a/lily/midi-walker.cc b/lily/midi-walker.cc index d87fb557a2..6dce3c9ee9 100644 --- a/lily/midi-walker.cc +++ b/lily/midi-walker.cc @@ -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)) 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 { -- 2.39.5