do not crash when loading old history files with MIDI edits; add all notes in region...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 10 Sep 2009 21:19:01 +0000 (21:19 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 10 Sep 2009 21:19:01 +0000 (21:19 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@5652 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_region_view.h
gtk2_ardour/midi_streamview.cc
libs/ardour/midi_model.cc

index 8e0b5f81250ece07aca9f6205f25e49346bc5dbd..cefde608dd0fb7408f57866b936195c9efcc3531 100644 (file)
@@ -775,8 +775,9 @@ MidiRegionView::redisplay_model()
 
                boost::shared_ptr<NoteType> 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<NoteType> note)
 }
 
 bool
-MidiRegionView::note_in_visible_range(const boost::shared_ptr<NoteType> note) const
+MidiRegionView::note_in_region_range(const boost::shared_ptr<NoteType> 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<NoteType> note)
+MidiRegionView::add_note(const boost::shared_ptr<NoteType> note, bool visible)
 {
        CanvasNoteEvent* event = 0;
        
@@ -1283,7 +1291,7 @@ MidiRegionView::add_note(const boost::shared_ptr<NoteType> 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 ();
index 6d05e2b8bfcc6f0423d7d3ba396ad055fd380168..952bd9517a100704fcea69588357ade0710fced4 100644 (file)
@@ -103,7 +103,7 @@ class MidiRegionView : public RegionView
 
        GhostRegion* add_ghost (TimeAxisView&);
 
-       void add_note(const boost::shared_ptr<NoteType> note);
+       void add_note(const boost::shared_ptr<NoteType> 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<NoteType> 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<NoteType> note, bool& visible) const;
 
        /** Get the region position in pixels relative to session. */
        double get_position_pixels();
index 6f2e81f0ffabed5593047fc3e3dff2d97f9be1d2..09abaeb74971c62bee7236d9c98f0ff4ca3bc54c 100644 (file)
@@ -589,8 +589,6 @@ MidiStreamView::update_rec_regions (boost::shared_ptr<MidiModel> 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<MidiModel> data, nframes_t
                                                                _highest_note = note->note();
                                                                update_range = true;
                                                        }
+
+                                                       mrv->add_note (note, !update_range);
+
                                                }
                                                
                                                mrv->extend_active_notes();
index 95d6d6a92401a412c5ac3d545271005ac6e692af..80c5759896ae26204f670dd8b4f2ab55c55fa608 100644 (file)
@@ -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;
 }