From 2ff1cd99af1b32434819c9dc48f1c5459837eaa3 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Sep 2009 21:19:01 +0000 Subject: [PATCH] do not crash when loading old history files with MIDI edits; add all notes in region to canvas, but pay attention to visibility git-svn-id: svn://localhost/ardour2/branches/3.0@5652 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/midi_region_view.cc | 30 +++++++++++++++++++----------- gtk2_ardour/midi_region_view.h | 8 +++++--- gtk2_ardour/midi_streamview.cc | 5 +++-- libs/ardour/midi_model.cc | 27 +++++++++++++++++---------- 4 files changed, 44 insertions(+), 26 deletions(-) diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 8e0b5f8125..cefde608dd 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -775,8 +775,9 @@ MidiRegionView::redisplay_model() boost::shared_ptr note (*n); CanvasNoteEvent* cne; - - if (note_in_visible_range (note)) { + bool visible; + + if (note_in_region_range (note, visible)) { if ((cne = find_canvas_note (note)) != 0) { @@ -791,11 +792,15 @@ MidiRegionView::redisplay_model() update_hit (ch); } - cne->show (); + if (visible) { + cne->show (); + } else { + cne->hide (); + } } else { - add_note (note); + add_note (note, visible); } } else { @@ -1158,13 +1163,16 @@ MidiRegionView::play_midi_note_off(boost::shared_ptr note) } bool -MidiRegionView::note_in_visible_range(const boost::shared_ptr note) const +MidiRegionView::note_in_region_range(const boost::shared_ptr note, bool& visible) const { const nframes64_t note_start_frames = beats_to_frames(note->time()); - bool outside = (note_start_frames - _region->start() >= _region->length()) - || (note_start_frames < _region->start()) - || (note->note() < midi_stream_view()->lowest_note()) - || (note->note() > midi_stream_view()->highest_note()); + + bool outside = (note_start_frames - _region->start() >= _region->length()) || + (note_start_frames < _region->start()); + + visible = (note->note() >= midi_stream_view()->lowest_note()) && + (note->note() <= midi_stream_view()->highest_note()); + return !outside; } @@ -1233,7 +1241,7 @@ MidiRegionView::update_hit (CanvasHit* ev) * event arrives, to properly display the note. */ void -MidiRegionView::add_note(const boost::shared_ptr note) +MidiRegionView::add_note(const boost::shared_ptr note, bool visible) { CanvasNoteEvent* event = 0; @@ -1283,7 +1291,7 @@ MidiRegionView::add_note(const boost::shared_ptr note) event->on_channel_selection_change(_last_channel_selection); _events.push_back(event); - if (note_in_visible_range(note)) { + if (visible) { event->show(); } else { event->hide (); diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index 6d05e2b8bf..952bd9517a 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -103,7 +103,7 @@ class MidiRegionView : public RegionView GhostRegion* add_ghost (TimeAxisView&); - void add_note(const boost::shared_ptr note); + void add_note(const boost::shared_ptr note, bool visible); void resolve_note(uint8_t note_num, double end_time); void cut_copy_clear (Editing::CutCopyOp); @@ -194,8 +194,10 @@ class MidiRegionView : public RegionView void move_selection(double dx, double dy); void note_dropped(ArdourCanvas::CanvasNoteEvent* ev, double d_pixels, uint8_t d_note); - /** Return true iff the note is within the currently visible range */ - bool note_in_visible_range(const boost::shared_ptr note) const; + /** Return true iff the note is within the extent of the region. + * @param visible will be set to true if the note is within the visible note range, false otherwise. + */ + bool note_in_region_range(const boost::shared_ptr note, bool& visible) const; /** Get the region position in pixels relative to session. */ double get_position_pixels(); diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 6f2e81f0ff..09abaeb749 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -589,8 +589,6 @@ MidiStreamView::update_rec_regions (boost::shared_ptr data, nframes_t if (note->time() + region->position() > start + dur) break; - mrv->add_note(note); - if (note->note() < _lowest_note) { _lowest_note = note->note(); update_range = true; @@ -598,6 +596,9 @@ MidiStreamView::update_rec_regions (boost::shared_ptr data, nframes_t _highest_note = note->note(); update_range = true; } + + mrv->add_note (note, !update_range); + } mrv->extend_active_notes(); diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc index 95d6d6a924..80c5759896 100644 --- a/libs/ardour/midi_model.cc +++ b/libs/ardour/midi_model.cc @@ -267,15 +267,19 @@ MidiModel::DeltaCommand::set_state(const XMLNode& delta_command) _added_notes.clear(); XMLNode* added_notes = delta_command.child(ADDED_NOTES_ELEMENT); - XMLNodeList notes = added_notes->children(); - transform(notes.begin(), notes.end(), back_inserter(_added_notes), - sigc::mem_fun(*this, &DeltaCommand::unmarshal_note)); + if (added_notes) { + XMLNodeList notes = added_notes->children(); + transform(notes.begin(), notes.end(), back_inserter(_added_notes), + sigc::mem_fun(*this, &DeltaCommand::unmarshal_note)); + } _removed_notes.clear(); XMLNode* removed_notes = delta_command.child(REMOVED_NOTES_ELEMENT); - notes = removed_notes->children(); - transform(notes.begin(), notes.end(), back_inserter(_removed_notes), - sigc::mem_fun(*this, &DeltaCommand::unmarshal_note)); + if (removed_notes) { + XMLNodeList notes = removed_notes->children(); + transform(notes.begin(), notes.end(), back_inserter(_removed_notes), + sigc::mem_fun(*this, &DeltaCommand::unmarshal_note)); + } return 0; } @@ -620,11 +624,14 @@ MidiModel::DiffCommand::set_state(const XMLNode& diff_command) _changes.clear(); XMLNode* changed_notes = diff_command.child(DIFF_NOTES_ELEMENT); - XMLNodeList notes = changed_notes->children(); - transform (notes.begin(), notes.end(), back_inserter(_changes), - sigc::mem_fun(*this, &DiffCommand::unmarshal_change)); - + if (changed_notes) { + XMLNodeList notes = changed_notes->children(); + + transform (notes.begin(), notes.end(), back_inserter(_changes), + sigc::mem_fun(*this, &DiffCommand::unmarshal_change)); + } + return 0; } -- 2.30.2