diff options
Diffstat (limited to 'libs/canvas/wave_view.cc')
-rw-r--r-- | libs/canvas/wave_view.cc | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/libs/canvas/wave_view.cc b/libs/canvas/wave_view.cc index 3521ef33cd..8570d8d32c 100644 --- a/libs/canvas/wave_view.cc +++ b/libs/canvas/wave_view.cc @@ -38,6 +38,8 @@ #include <gdkmm/general.h> +#include "gtk2_ardour/gui_thread.h" + using namespace std; using namespace ARDOUR; using namespace ArdourCanvas; @@ -74,6 +76,10 @@ WaveView::WaveView (Canvas* c, boost::shared_ptr<ARDOUR::AudioRegion> region) , _start_shift (0.0) , _region_start (region->start()) { + _region->DropReferences.connect (_source_invalidated_connection, MISSING_INVALIDATOR, + boost::bind (&ArdourCanvas::WaveView::invalidate_source, + this, boost::weak_ptr<AudioSource>(_region->audio_source())), gui_context()); + VisualPropertiesChanged.connect_same_thread (invalidation_connection, boost::bind (&WaveView::handle_visual_property_change, this)); ClipLevelChanged.connect_same_thread (invalidation_connection, boost::bind (&WaveView::handle_clip_level_change, this)); } @@ -97,12 +103,17 @@ WaveView::WaveView (Item* parent, boost::shared_ptr<ARDOUR::AudioRegion> region) , _region_amplitude (_region->scale_amplitude ()) , _region_start (region->start()) { + _region->DropReferences.connect (_source_invalidated_connection, MISSING_INVALIDATOR, + boost::bind (&ArdourCanvas::WaveView::invalidate_source, + this, boost::weak_ptr<AudioSource>(_region->audio_source())), gui_context()); + VisualPropertiesChanged.connect_same_thread (invalidation_connection, boost::bind (&WaveView::handle_visual_property_change, this)); ClipLevelChanged.connect_same_thread (invalidation_connection, boost::bind (&WaveView::handle_clip_level_change, this)); } WaveView::~WaveView () { + _source_invalidated_connection.disconnect(); invalidate_image_cache (); } @@ -206,23 +217,32 @@ WaveView::set_clip_level (double dB) } void -WaveView::invalidate_image_cache () +WaveView::invalidate_source (boost::weak_ptr<AudioSource> src) { - vector <uint32_t> deletion_list; - vector <CacheEntry> caches; + if (boost::shared_ptr<AudioSource> source = src.lock()) { - /* 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 (); + for (i = _image_cache.begin (); i != _image_cache.end (); ++i) { + if (i->first == source) { + for (uint32_t n = 0; n < i->second.size (); ++n) { + i->second[n].image.clear (); } - (*i).second.clear (); - _image_cache.erase(i->first); + i->second.clear (); + _image_cache.erase (i->first); } } + } +} + +void +WaveView::invalidate_image_cache () +{ + vector <uint32_t> deletion_list; + vector <CacheEntry> caches; + + /* The source may have disappeared.*/ + + if (_region->n_channels() == 0) { return; } |