From 9f1a0d54bb060ebcac66780f69e15e281a4c93e8 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Thu, 18 Jan 2007 13:22:30 +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. --- lily/audio-staff.cc | 2 ++ lily/include/midi-item.hh | 1 - lily/include/midi-walker.hh | 5 +++-- lily/midi-item.cc | 1 - lily/midi-walker.cc | 19 +++++++++++++++---- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/lily/audio-staff.cc b/lily/audio-staff.cc index 120313ef64..bd7edf5544 100644 --- a/lily/audio-staff.cc +++ b/lily/audio-staff.cc @@ -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); } diff --git a/lily/include/midi-item.hh b/lily/include/midi-item.hh index f7ea0e0585..a03532694f 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 69bf4c8a9b..8ea8b27b64 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_; @@ -47,6 +47,7 @@ private: 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 88f9aeb86f..4a633cc79d 100644 --- a/lily/midi-item.cc +++ b/lily/midi-item.cc @@ -466,5 +466,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 941e64c282..c9a1fc2839 100644 --- a/lily/midi-walker.cc +++ b/lily/midi-walker.cc @@ -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)) 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 { -- 2.39.5