Fix 0006183 (waveview crash).
[ardour.git] / libs / canvas / wave_view.cc
index 64b59757000255d242634c9213940f5b545366ab..3521ef33cd20bc610a745ceb7196cf06c7baab64 100644 (file)
@@ -211,6 +211,21 @@ WaveView::invalidate_image_cache ()
        vector <uint32_t> deletion_list;
        vector <CacheEntry> caches;
 
+       /* The source may have disappeared in the case of rec regions.*/
+       if (_region->n_channels() == 0) {
+               std::map <boost::shared_ptr<ARDOUR::AudioSource>, std::vector <CacheEntry> >::iterator i;
+               for (i = _image_cache.begin(); i != _image_cache.end(); ++i) {
+                       if (i->first.unique()) {
+                               for (uint32_t n = 0; n < (*i).second.size (); ++n) {
+                                       (*i).second[n].image.clear ();
+                               }
+                               (*i).second.clear ();
+                               _image_cache.erase(i->first);
+                       }
+               }
+               return;
+       }
+
        if (_image_cache.find (_region->audio_source ()) != _image_cache.end ()) {
                caches = _image_cache.find (_region->audio_source ())->second;
        } else {
@@ -228,7 +243,6 @@ WaveView::invalidate_image_cache ()
                }
 
                deletion_list.push_back (i);
-
        }
 
        while (deletion_list.size() > 0) {
@@ -242,7 +256,6 @@ WaveView::invalidate_image_cache ()
        } else {
                _image_cache[_region->audio_source ()] = caches;
        }
-
 }
 
 void
@@ -786,8 +799,8 @@ WaveView::get_image (Cairo::RefPtr<Cairo::ImageSurface>& image, framepos_t start
        /* we can request data from anywhere in the Source, between 0 and its length
         */
 
-       framepos_t sample_start = max ((framepos_t) _region->start(), (center - canvas_samples));
-       framepos_t sample_end = min (center + canvas_samples, _region->start() + _region->length());
+       framepos_t sample_start = max ((framepos_t) 0, (center - canvas_samples));
+       framepos_t sample_end = min (center + canvas_samples, _region->source_length (0));
 
        const int n_peaks = llrintf ((sample_end - sample_start)/ (double) _samples_per_pixel);