Fix note delete crash bug.
authorDavid Robillard <d@drobilla.net>
Wed, 1 Aug 2007 23:18:56 +0000 (23:18 +0000)
committerDavid Robillard <d@drobilla.net>
Wed, 1 Aug 2007 23:18:56 +0000 (23:18 +0000)
Fix midi recording crash bug.

git-svn-id: svn://localhost/ardour2/trunk@2216 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_streamview.cc
libs/ardour/ardour/midi_source.h
libs/ardour/midi_source.cc
libs/ardour/smf_source.cc

index 61d3ce770de0a834fd21d6dd7f0c1a224cb0b805..eadbb7ce52d5431225715d994f220c8499f603a9 100644 (file)
@@ -61,6 +61,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &
                                  Gdk::Color& basic_color)
        : RegionView (parent, tv, r, spu, basic_color)
        , _active_notes(0)
+       , _delta_command(NULL)
        , _command_mode(None)
 {
 }
@@ -69,6 +70,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &
                                  Gdk::Color& basic_color, TimeAxisViewItem::Visibility visibility)
        : RegionView (parent, tv, r, spu, basic_color, visibility)
        , _active_notes(0)
+       , _delta_command(NULL)
        , _command_mode(None)
 {
 }
@@ -76,6 +78,9 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &
 void
 MidiRegionView::init (Gdk::Color& basic_color, bool wfd)
 {
+       if (wfd)
+               midi_region()->midi_source(0)->load_model();
+
        _model = midi_region()->midi_source(0)->model();
        _enable_display = false;
        
index 31a36ebd39564904df356731c4a12c04b45e4aff..30de0090fd30cefea44034b8129fdc5569d5bdc1 100644 (file)
@@ -108,8 +108,10 @@ MidiStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wfd)
        
        /* follow global waveform setting */
 
-       if (wfd)
+       if (wfd) {
                region_view->enable_display(true);
+               region_view->midi_region()->midi_source(0)->load_model();
+       }
 
        /* display events and find note range */
        display_region(region_view);
@@ -134,10 +136,12 @@ MidiStreamView::display_region(MidiRegionView* region_view)
        boost::shared_ptr<MidiSource> source(region_view->midi_region()->midi_source(0));
        source->load_model();
 
-       // Find our note range
-       for (size_t i=0; i < source->model()->n_notes(); ++i) {
-               const MidiModel::Note& note = source->model()->note_at(i);
-               update_bounds(note.note());
+       if (source->model()) {
+               // Find our note range
+               for (size_t i=0; i < source->model()->n_notes(); ++i) {
+                       const MidiModel::Note& note = source->model()->note_at(i);
+                       update_bounds(note.note());
+               }
        }
        
        // Display region contents
@@ -151,8 +155,15 @@ MidiStreamView::redisplay_diskstream ()
        list<RegionView *>::iterator i, tmp;
 
        for (i = region_views.begin(); i != region_views.end(); ++i) {
-               (*i)->enable_display(false);
+               (*i)->enable_display(true); // FIXME: double display
                (*i)->set_valid (false);
+               
+               /* FIXME: slow.  MidiRegionView needs a find_note_range method
+                * that finds the range without wasting time drawing the events */
+
+               // Load model if it isn't already, to get note range
+               MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*i);
+               mrv->midi_region()->midi_source(0)->load_model();
        }
        
        //_lowest_note = 60; // middle C
index ba4fe99604c430bed1385cf955cbefc44dc2b8e4..c812f465ea91d36b0b105057cbeaa0494f93015d 100644 (file)
@@ -90,6 +90,7 @@ class MidiSource : public Source
 
        boost::shared_ptr<MidiModel> _model;
        bool                         _model_loaded;
+       bool                         _writing;
 
   private:
        bool file_changed (string path);
index 09e574c2ed31725da14d742a4c4e4ec869e1af14..59aeddf8319496b885b552645e47b11c5ce4fa8e 100644 (file)
@@ -46,6 +46,7 @@ MidiSource::MidiSource (Session& s, string name)
        : Source (s, name, DataType::MIDI)
        , _model(new MidiModel(s))
        , _model_loaded (false)
+       , _writing (false)
 {
        _read_data_count = 0;
        _write_data_count = 0;
@@ -55,6 +56,7 @@ MidiSource::MidiSource (Session& s, const XMLNode& node)
        : Source (s, node)
        , _model(new MidiModel(s))
        , _model_loaded (false)
+       , _writing (false)
 {
        _read_data_count = 0;
        _write_data_count = 0;
@@ -131,6 +133,8 @@ MidiSource::mark_streaming_midi_write_started (NoteMode mode)
                _model->set_note_mode(mode);
                _model->start_write();
        }
+       
+       _writing = true;
 }
 
 void
@@ -138,6 +142,8 @@ MidiSource::mark_streaming_write_started ()
 {
        if (_model)
                _model->start_write();
+
+       _writing = true;
 }
 
 void
@@ -145,5 +151,7 @@ MidiSource::mark_streaming_write_completed ()
 {
        if (_model)
                _model->end_write(false); // FIXME: param?
+
+       _writing = false;
 }
 
index 4ae1cd34abdc51449514689aefc0682c33c3961d..686fb96af3e9c409dadb04e8e45a1729135541a0 100644 (file)
@@ -796,6 +796,9 @@ SMFSource::read_var_len() const
 void
 SMFSource::load_model(bool lock, bool force_reload)
 {
+       if (_writing)
+               return;
+
        if (lock)
                Glib::Mutex::Lock lm (_lock);