diff options
author | David Robillard <d@drobilla.net> | 2007-08-01 23:18:56 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-08-01 23:18:56 +0000 |
commit | 874f3bbf8b4b8bb3e92f31c96623b1bcb4dd5c8a (patch) | |
tree | b649f164fa22e8a05b9d70c7022e1c1e02829223 | |
parent | 6698f5f686bef82b0c9568558c83a3b9b3344700 (diff) |
Fix note delete crash bug.
Fix midi recording crash bug.
git-svn-id: svn://localhost/ardour2/trunk@2216 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 5 | ||||
-rw-r--r-- | gtk2_ardour/midi_streamview.cc | 23 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_source.h | 1 | ||||
-rw-r--r-- | libs/ardour/midi_source.cc | 8 | ||||
-rw-r--r-- | libs/ardour/smf_source.cc | 3 |
5 files changed, 34 insertions, 6 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 61d3ce770d..eadbb7ce52 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -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; diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 31a36ebd39..30de0090fd 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -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 diff --git a/libs/ardour/ardour/midi_source.h b/libs/ardour/ardour/midi_source.h index ba4fe99604..c812f465ea 100644 --- a/libs/ardour/ardour/midi_source.h +++ b/libs/ardour/ardour/midi_source.h @@ -90,6 +90,7 @@ class MidiSource : public Source boost::shared_ptr<MidiModel> _model; bool _model_loaded; + bool _writing; private: bool file_changed (string path); diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc index 09e574c2ed..59aeddf831 100644 --- a/libs/ardour/midi_source.cc +++ b/libs/ardour/midi_source.cc @@ -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; } diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index 4ae1cd34ab..686fb96af3 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -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); |