diff options
author | David Robillard <d@drobilla.net> | 2007-08-16 01:25:58 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-08-16 01:25:58 +0000 |
commit | f9a7388d7aa62c6b8ab0bc8c62bf53ae1652e8e1 (patch) | |
tree | b3737567d21c42688ff3129f28be144898cb28a6 /gtk2_ardour | |
parent | 356f9ba80aabb8705ce24ad78b2b409d084a718e (diff) |
Make SMFSource suck significantly less.
Read from MidiRingbuffer directly into model, don't read MidiRingBuffer into a new midi buffer, then into the model.
Pass rec data to UI via model instead of a separate buffer.
Read MIDI CC data into MidiModel (though not actually used yet).
Made quantization toggle edited flag so model is saved.
git-svn-id: svn://localhost/ardour2/trunk@2308 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 23 | ||||
-rw-r--r-- | gtk2_ardour/midi_streamview.cc | 29 | ||||
-rw-r--r-- | gtk2_ardour/midi_streamview.h | 5 |
3 files changed, 39 insertions, 18 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index e96a65d893..c51cd314a2 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -394,11 +394,14 @@ MidiRegionView::display_model(boost::shared_ptr<MidiModel> model) void MidiRegionView::redisplay_model() { - clear_events(); - - //cerr << "Redisplaying model " << _model << endl; + // Don't redisplay the model if we're currently recording and displaying that + if (_active_notes) + return; if (_model) { + + clear_events(); + begin_write(); for (size_t i=0; i < _model->n_notes(); ++i) @@ -406,7 +409,7 @@ MidiRegionView::redisplay_model() end_write(); } else { - warning << "MidiRegionView::redisplay_model called without a model" << endmsg; + cerr << "MidiRegionView::redisplay_model called without a model" << endmsg; } } @@ -414,7 +417,10 @@ MidiRegionView::redisplay_model() MidiRegionView::~MidiRegionView () { in_destructor = true; - end_write(); + if (_active_notes) + end_write(); + + clear_events(); RegionViewGoingAway (this); /* EMIT_SIGNAL */ } @@ -488,6 +494,7 @@ MidiRegionView::add_ghost (AutomationTimeAxisView& atv) void MidiRegionView::begin_write() { + assert(!_active_notes); _active_notes = new CanvasNote*[128]; for (unsigned i=0; i < 128; ++i) _active_notes[i] = NULL; @@ -512,9 +519,9 @@ MidiRegionView::end_write() void MidiRegionView::add_event (const MidiEvent& ev) { - /*printf("Event, time = %f, size = %zu, data = ", ev.time, ev.size); - for (size_t i=0; i < ev.size; ++i) { - printf("%X ", ev.buffer[i]); + /*printf("MRV add Event, time = %f, size = %u, data = ", ev.time(), ev.size()); + for (size_t i=0; i < ev.size(); ++i) { + printf("%X ", ev.buffer()[i]); } printf("\n\n");*/ diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 484def2a3e..21eae23f90 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -410,7 +410,7 @@ MidiStreamView::setup_rec_box () } void -MidiStreamView::update_rec_regions (boost::shared_ptr<MidiBuffer> data, nframes_t start, nframes_t dur) +MidiStreamView::update_rec_regions (boost::shared_ptr<MidiModel> data, nframes_t start, nframes_t dur) { ENSURE_GUI_THREAD (bind (mem_fun (*this, &MidiStreamView::update_rec_regions), data, start, dur)); @@ -467,11 +467,24 @@ MidiStreamView::update_rec_regions (boost::shared_ptr<MidiBuffer> data, nframes_ /* draw events */ MidiRegionView* mrv = (MidiRegionView*)iter->second; - for (MidiBuffer::iterator i = data->begin(); i != data->end(); ++i) { - const MidiEvent& ev = *i; - mrv->add_event(ev); - mrv->extend_active_notes(); + // FIXME: slow + for (size_t i=0; i < data->n_notes(); ++i) { + const MidiModel::Note& note = data->note_at(i); + if (note.time() > start + dur) + break; + + if (note.time() >= start) + if (data->note_mode() == Percussive || note.duration() > 0) + mrv->add_note(note); + else + mrv->add_event(note.on_event()); + + if (note.duration() > 0 && note.end_time() >= start) + mrv->add_event(note.off_event()); + } + + mrv->extend_active_notes(); } } @@ -508,18 +521,18 @@ MidiStreamView::update_rec_regions (boost::shared_ptr<MidiBuffer> data, nframes_ } void -MidiStreamView::rec_data_range_ready (boost::shared_ptr<MidiBuffer> data, jack_nframes_t start, jack_nframes_t dur, boost::weak_ptr<Source> weak_src) +MidiStreamView::rec_data_range_ready (jack_nframes_t start, jack_nframes_t dur, boost::weak_ptr<Source> weak_src) { // this is called from the butler thread for now - ENSURE_GUI_THREAD(bind (mem_fun (*this, &MidiStreamView::rec_data_range_ready), data, start, dur, weak_src)); + ENSURE_GUI_THREAD(bind (mem_fun (*this, &MidiStreamView::rec_data_range_ready), start, dur, weak_src)); boost::shared_ptr<SMFSource> src (boost::dynamic_pointer_cast<SMFSource>(weak_src.lock())); //cerr << src.get() << " MIDI READY: " << start << " * " << dur // << " -- " << data->size() << " events!" << endl; - this->update_rec_regions (data, start, dur); + this->update_rec_regions (src->model(), start, dur); } void diff --git a/gtk2_ardour/midi_streamview.h b/gtk2_ardour/midi_streamview.h index 567844e678..fa414cfe9c 100644 --- a/gtk2_ardour/midi_streamview.h +++ b/gtk2_ardour/midi_streamview.h @@ -40,6 +40,7 @@ namespace ARDOUR { class PeakData; class MidiRegion; class Source; + class MidiModel; } class PublicEditor; @@ -95,8 +96,8 @@ class MidiStreamView : public StreamView private: void setup_rec_box (); - void rec_data_range_ready (boost::shared_ptr<ARDOUR::MidiBuffer> data, jack_nframes_t start, jack_nframes_t dur, boost::weak_ptr<ARDOUR::Source> src); - void update_rec_regions (boost::shared_ptr<ARDOUR::MidiBuffer> data, jack_nframes_t start, jack_nframes_t dur); + void rec_data_range_ready (jack_nframes_t start, jack_nframes_t dur, boost::weak_ptr<ARDOUR::Source> src); + void update_rec_regions (boost::shared_ptr<ARDOUR::MidiModel> data, jack_nframes_t start, jack_nframes_t dur); RegionView* add_region_view_internal (boost::shared_ptr<ARDOUR::Region>, bool wait_for_waves); void display_region(MidiRegionView* region_view, bool load_model); |