summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/audio_streamview.cc63
-rw-r--r--gtk2_ardour/automation_streamview.cc27
-rw-r--r--gtk2_ardour/midi_streamview.cc55
-rw-r--r--gtk2_ardour/streamview.cc61
-rw-r--r--gtk2_ardour/streamview.h1
-rw-r--r--libs/ardour/midi_diskstream.cc1
-rw-r--r--libs/evoral/evoral/midi_util.h2
-rw-r--r--libs/evoral/src/Sequence.cpp4
8 files changed, 83 insertions, 131 deletions
diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc
index 4ea7269f40..320bc1f195 100644
--- a/gtk2_ardour/audio_streamview.cc
+++ b/gtk2_ardour/audio_streamview.cc
@@ -365,13 +365,16 @@ AudioStreamView::remove_crossfade (boost::shared_ptr<Region> r)
void
AudioStreamView::redisplay_diskstream ()
{
- list<RegionView *>::iterator i, tmp;
+ list<RegionView *>::iterator i;
list<CrossfadeView*>::iterator xi, tmpx;
+ // Flag region views as invalid and disable drawing
for (i = region_views.begin(); i != region_views.end(); ++i) {
(*i)->set_valid (false);
+ (*i)->enable_display (false);
}
+ // Flag crossfade views as invalid
for (xi = crossfade_views.begin(); xi != crossfade_views.end(); ++xi) {
(*xi)->set_valid (false);
if ((*xi)->visible() && _layer_display != Stacked) {
@@ -379,6 +382,7 @@ AudioStreamView::redisplay_diskstream ()
}
}
+ // Add and display region and crossfade views, and flag them as valid
if (_trackview.is_audio_track()) {
_trackview.get_diskstream()->playlist()->foreach_region(
static_cast<StreamView*>(this),
@@ -389,53 +393,8 @@ AudioStreamView::redisplay_diskstream ()
if (apl)
apl->foreach_crossfade (this, &AudioStreamView::add_crossfade);
}
-
- RegionViewList copy;
-
- // Build a list of region views sorted by layer, and remove invalids
- for (i = region_views.begin(); i != region_views.end(); ) {
- tmp = i;
- tmp++;
-
- if (!(*i)->is_valid()) {
- delete *i;
- region_views.erase (i);
- i = tmp;
- continue;
- } else {
- (*i)->enable_display(true);
- }
-
- if (copy.size() == 0) {
- copy.push_front((*i));
- i = tmp;
- continue;
- }
-
- RegionViewList::iterator k = copy.begin();
- RegionViewList::iterator l = copy.end();
- l--;
-
- if ((*i)->region()->layer() <= (*k)->region()->layer()) {
- copy.push_front((*i));
- i = tmp;
- continue;
- } else if ((*i)->region()->layer() >= (*l)->region()->layer()) {
- copy.push_back((*i));
- i = tmp;
- continue;
- }
-
- for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) {
- if ((*j)->region()->layer() >= (*i)->region()->layer()) {
- copy.insert(j, (*i));
- break;
- }
- }
-
- i = tmp;
- }
-
+
+ // Remove invalid crossfade views
for (xi = crossfade_views.begin(); xi != crossfade_views.end();) {
tmpx = xi;
tmpx++;
@@ -447,11 +406,9 @@ AudioStreamView::redisplay_diskstream ()
xi = tmpx;
}
-
- // Fix canvas layering by raising each in the sorted list order
- for (RegionViewList::iterator i = copy.begin(); i != copy.end(); ++i) {
- region_layered (*i);
- }
+
+ // Stack regions by layer, and remove invalid regions
+ layer_regions();
}
void
diff --git a/gtk2_ardour/automation_streamview.cc b/gtk2_ardour/automation_streamview.cc
index e7ab760709..2769ab846d 100644
--- a/gtk2_ardour/automation_streamview.cc
+++ b/gtk2_ardour/automation_streamview.cc
@@ -158,35 +158,20 @@ AutomationStreamView::redisplay_diskstream ()
{
list<RegionView *>::iterator i, tmp;
+ // Flag region views as invalid and disable drawing
for (i = region_views.begin(); i != region_views.end(); ++i) {
(*i)->set_valid (false);
+ (*i)->enable_display(false);
}
-
+
+ // Add and display region views, and flag them as valid
if (_trackview.is_track()) {
_trackview.get_diskstream()->playlist()->foreach_region (
static_cast<StreamView*>(this), &StreamView::add_region_view);
}
-
- for (i = region_views.begin(); i != region_views.end(); ) {
- tmp = i;
- tmp++;
-
- if (!(*i)->is_valid()) {
- delete *i;
- region_views.erase (i);
- } else {
- (*i)->enable_display(true);
- (*i)->set_height(height);
- }
-
- i = tmp;
- }
- /* now fix layering */
-
- for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) {
- region_layered (*i);
- }
+ // Stack regions by layer, and remove invalid regions
+ layer_regions();
}
diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc
index 178919a32c..5bb232bded 100644
--- a/gtk2_ardour/midi_streamview.cc
+++ b/gtk2_ardour/midi_streamview.cc
@@ -236,7 +236,7 @@ MidiStreamView::redisplay_diskstream ()
return;
}
- list<RegionView*>::iterator i, tmp;
+ list<RegionView*>::iterator i;
// Load models if necessary, and find note range of all our contents
_range_dirty = false;
@@ -264,60 +264,15 @@ MidiStreamView::redisplay_diskstream ()
(*i)->enable_display(false);
}
- // Add and display region views, and flag existing ones as valid
+ // Add and display region views, and flag them as valid
_trackview.get_diskstream()->playlist()->foreach_region(
static_cast<StreamView*>(this),
&StreamView::add_region_view);
- // Build a list of region views sorted by layer, and remove invalids
- RegionViewList copy;
- for (i = region_views.begin(); i != region_views.end(); ) {
- tmp = i;
- tmp++;
-
- if (!(*i)->is_valid()) {
- delete *i;
- region_views.erase (i);
- i = tmp;
- continue;
- }
-
- if (copy.size() == 0) {
- copy.push_front((*i));
- i = tmp;
- continue;
- }
-
- RegionViewList::iterator k = copy.begin();
- RegionViewList::iterator l = copy.end();
- l--;
-
- if ((*i)->region()->layer() <= (*k)->region()->layer()) {
- copy.push_front((*i));
- i = tmp;
- continue;
- } else if ((*i)->region()->layer() >= (*l)->region()->layer()) {
- copy.push_back((*i));
- i = tmp;
- continue;
- }
-
- for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) {
- if ((*j)->region()->layer() >= (*i)->region()->layer()) {
- copy.insert(j, (*i));
- break;
- }
- }
+ // Stack regions by layer, and remove invalid regions
+ layer_regions();
- i = tmp;
- }
-
- // Fix canvas layering by raising each in the sorted list order
- for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) {
- region_layered (*j);
- }
-
- // Update note range (not to regions which are already good) and draw note lines
+ // Update note range (not regions which are correct) and draw note lines
apply_note_range(_lowest_note, _highest_note, false);
}
diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc
index ab61338d2d..5810d10eaf 100644
--- a/gtk2_ardour/streamview.cc
+++ b/gtk2_ardour/streamview.cc
@@ -70,11 +70,7 @@ StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Group* group)
canvas_rect->property_y2() = (double) tv.current_height();
canvas_rect->raise(1); // raise above tempo lines
- // DR-way
canvas_rect->property_outline_what() = (guint32) (0x2|0x8); // outline RHS and bottom
- // 2.0 way
- //canvas_rect->property_outline_what() = (guint32) (0x1|0x2|0x8); // outline ends and bottom
- // (Fill/Outline colours set in derived classes)
canvas_rect->signal_event().connect (bind (mem_fun (_trackview.editor(), &PublicEditor::canvas_stream_view_event), canvas_rect, &_trackview));
@@ -226,6 +222,63 @@ StreamView::playlist_modified_weak (boost::weak_ptr<Diskstream> ds)
}
void
+StreamView::layer_regions()
+{
+ // In one traversal of the region view list:
+ // - Build a list of region views sorted by layer
+ // - Remove invalid views from the actual region view list
+ RegionViewList copy;
+ list<RegionView*>::iterator i, tmp;
+ for (i = region_views.begin(); i != region_views.end(); ) {
+ tmp = i;
+ tmp++;
+
+ if (!(*i)->is_valid()) {
+ delete *i;
+ region_views.erase (i);
+ i = tmp;
+ continue;
+ } else {
+ (*i)->enable_display(true);
+ }
+
+ if (copy.size() == 0) {
+ copy.push_front((*i));
+ i = tmp;
+ continue;
+ }
+
+ RegionViewList::iterator k = copy.begin();
+ RegionViewList::iterator l = copy.end();
+ l--;
+
+ if ((*i)->region()->layer() <= (*k)->region()->layer()) {
+ copy.push_front((*i));
+ i = tmp;
+ continue;
+ } else if ((*i)->region()->layer() >= (*l)->region()->layer()) {
+ copy.push_back((*i));
+ i = tmp;
+ continue;
+ }
+
+ for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) {
+ if ((*j)->region()->layer() >= (*i)->region()->layer()) {
+ copy.insert(j, (*i));
+ break;
+ }
+ }
+
+ i = tmp;
+ }
+
+ // Fix canvas layering by raising each in the sorted list order
+ for (RegionViewList::iterator i = copy.begin(); i != copy.end(); ++i) {
+ region_layered (*i);
+ }
+}
+
+void
StreamView::playlist_modified (boost::shared_ptr<Diskstream> ds)
{
/* we do not allow shared_ptr<T> to be bound to slots */
diff --git a/gtk2_ardour/streamview.h b/gtk2_ardour/streamview.h
index 932e919cee..0cbb4447d5 100644
--- a/gtk2_ardour/streamview.h
+++ b/gtk2_ardour/streamview.h
@@ -124,6 +124,7 @@ protected:
void display_diskstream (boost::shared_ptr<ARDOUR::Diskstream>);
virtual void undisplay_diskstream ();
void diskstream_changed ();
+ void layer_regions ();
virtual void playlist_changed (boost::shared_ptr<ARDOUR::Diskstream>);
virtual void playlist_modified_weak (boost::weak_ptr<ARDOUR::Diskstream>);
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index f960c170db..ff6d05a4ac 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -1508,3 +1508,4 @@ MidiDiskstream::get_playback(MidiBuffer& dst, nframes_t start, nframes_t end, nf
_midi_state_tracker.resolve_notes(dst, end-start - 1 + offset);
}
}
+
diff --git a/libs/evoral/evoral/midi_util.h b/libs/evoral/evoral/midi_util.h
index 3d6ac095bb..5dfc3c70fd 100644
--- a/libs/evoral/evoral/midi_util.h
+++ b/libs/evoral/evoral/midi_util.h
@@ -26,7 +26,7 @@
namespace Evoral {
/** Return the size of the given event including the status byte,
- * or -1 if unknown (eg sysex)
+ * or -1 if unknown (e.g. sysex)
*/
static inline int
midi_event_size(unsigned char status)
diff --git a/libs/evoral/src/Sequence.cpp b/libs/evoral/src/Sequence.cpp
index ffe5de9f70..01aca0e4a4 100644
--- a/libs/evoral/src/Sequence.cpp
+++ b/libs/evoral/src/Sequence.cpp
@@ -134,7 +134,7 @@ Sequence<Time>::const_iterator::const_iterator(const Sequence<Time>& seq, Time t
<< "], event ignored" << endl;
continue;
}
-#endif
+ #endif
const ControlIterator new_iter(i->second->list(), x, y);
@@ -265,7 +265,7 @@ Sequence<Time>::const_iterator::operator++()
if (! (ev.is_note() || ev.is_cc() || ev.is_pgm_change()
|| ev.is_pitch_bender() || ev.is_channel_pressure() || ev.is_sysex()) ) {
- cerr << "Unknown event type: " << hex << int(ev.buffer()[0])
+ cerr << "WARNING: Unknown event type: " << hex << int(ev.buffer()[0])
<< int(ev.buffer()[1]) << int(ev.buffer()[2]) << endl;
}