summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-08-16 01:25:58 +0000
committerDavid Robillard <d@drobilla.net>2007-08-16 01:25:58 +0000
commitf9a7388d7aa62c6b8ab0bc8c62bf53ae1652e8e1 (patch)
treeb3737567d21c42688ff3129f28be144898cb28a6 /gtk2_ardour
parent356f9ba80aabb8705ce24ad78b2b409d084a718e (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.cc23
-rw-r--r--gtk2_ardour/midi_streamview.cc29
-rw-r--r--gtk2_ardour/midi_streamview.h5
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);