View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0006183 | ardour | bugs | public | 2015-02-26 16:40 | 2020-04-19 20:17 |
Reporter | tlat | Assigned To | tlat | ||
Priority | normal | Severity | crash | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Summary | 0006183: crash after "stop and forget capture" | ||||
Description | git f4203cc example: 0) new session 1) new track 2) arm track 3) play toggle-record 5 or more times to get separate chunks 4) [stop and forget capture] game over or, if you are lucky, repeat 3 and 4 There is a reference to _sources[0] (returned from AudioRegion::audio_source) in `WaveView::invalidate_image_cache' (called from ~WaveView), but the region is deleted and the size of _sources is zero. Attached the stack frames and a raw patch. | ||||
Tags | No tags attached. | ||||
2015-02-26 16:40
|
stop_and_forget_capture.patch (1,360 bytes)
diff --git a/libs/canvas/wave_view.cc b/libs/canvas/wave_view.cc index 3f2c608..606879a 100644 --- a/libs/canvas/wave_view.cc +++ b/libs/canvas/wave_view.cc @@ -104,6 +104,15 @@ WaveView::WaveView (Item* parent, boost::shared_ptr<ARDOUR::AudioRegion> region) WaveView::~WaveView () { invalidate_image_cache (); + + if (!_image_cache.empty()) { + 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()) { + _image_cache.erase(i->first); + } + } + } } void @@ -211,6 +220,10 @@ WaveView::invalidate_image_cache () vector <uint32_t> deletion_list; vector <CacheEntry> caches; + if (_region->n_channels() == 0) { + return; + } + if (_image_cache.find (_region->audio_source ()) != _image_cache.end ()) { caches = _image_cache.find (_region->audio_source ())->second; } else { @@ -237,10 +250,12 @@ WaveView::invalidate_image_cache () deletion_list.pop_back(); } - if (caches.size () == 0) { - _image_cache.erase(_region->audio_source ()); - } else { - _image_cache[_region->audio_source ()] = caches; + if (_region->sources().size() > 0) { + if (caches.size () == 0) { + _image_cache.erase(_region->audio_source ()); + } else { + _image_cache[_region->audio_source ()] = caches; + } } } |
2015-02-26 16:41
|
bt.log (8,529 bytes)
#0 0x000000000684c6d0 in ?? () #1 0x0000000000f426e6 in boost::detail::sp_counted_base::release (this=0x68bc150) at /usr/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:146 #2 0x0000000000f42775 in boost::detail::shared_count::~shared_count (this=0x7fffffffba18, __in_chrg=<optimized out>) at /usr/include/boost/smart_ptr/detail/shared_count.hpp:371 #3 0x000000000101bff0 in boost::shared_ptr<ARDOUR::Source>::~shared_ptr (this=0x7fffffffba10, __in_chrg=<optimized out>) at /usr/include/boost/smart_ptr/shared_ptr.hpp:328 #4 0x00007ffff6f3d095 in ARDOUR::AudioRegion::audio_source (this=0x7f13e50, n=0) at ../libs/ardour/audioregion.cc:1561 #5 0x00007ffff7941d4d in ArdourCanvas::WaveView::invalidate_image_cache (this=0x6578f70) at ../libs/canvas/wave_view.cc:214 #6 0x00007ffff79417fc in ArdourCanvas::WaveView::~WaveView (this=0x6578f70, __in_chrg=<optimized out>) at ../libs/canvas/wave_view.cc:106 #7 0x00007ffff79418dc in ArdourCanvas::WaveView::~WaveView (this=0x6578f70, __in_chrg=<optimized out>) at ../libs/canvas/wave_view.cc:107 #8 0x00007ffff7920f60 in ArdourCanvas::Item::clear_items (this=0x7b15c20, with_delete=true) at ../libs/canvas/item.cc:930 #9 0x00007ffff791de6d in ArdourCanvas::Item::~Item (this=0x7b15c20, __in_chrg=<optimized out>) at ../libs/canvas/item.cc:103 #10 0x00000000017686c7 in ArdourCanvas::Container::~Container (this=0x7b15c20, __in_chrg=<optimized out>) at /mnt/part/src/ardour/libs/canvas/canvas/container.h:39 #11 0x0000000001768700 in ArdourCanvas::Container::~Container (this=0x7b15c20, __in_chrg=<optimized out>) at /mnt/part/src/ardour/libs/canvas/canvas/container.h:39 #12 0x000000000130f999 in GhostRegion::~GhostRegion (this=0x69ff650, __in_chrg=<optimized out>) at ../gtk2_ardour/ghostregion.cc:73 #13 0x0000000001313d44 in AudioGhostRegion::~AudioGhostRegion (this=0x69ff650, __in_chrg=<optimized out>) at ../gtk2_ardour/ghostregion.h:61 #14 0x0000000001313d94 in AudioGhostRegion::~AudioGhostRegion (this=0x69ff650, __in_chrg=<optimized out>) at ../gtk2_ardour/ghostregion.h:61 #15 0x00000000015fd679 in RegionView::~RegionView (this=0x7a6cf20, __vtt_parm=0x184d6e8 <VTT for AudioRegionView+8>, __in_chrg=<optimized out>) at ../gtk2_ardour/region_view.cc:204 #16 0x0000000001000aa5 in AudioRegionView::~AudioRegionView (this=0x7a6cf20, __in_chrg=<optimized out>, __vtt_parm=<optimized out>) at ../gtk2_ardour/audio_region_view.cc:245 #17 0x0000000001000be0 in AudioRegionView::~AudioRegionView (this=0x7a6cf20, __in_chrg=<optimized out>, __vtt_parm=<optimized out>) at ../gtk2_ardour/audio_region_view.cc:260 #18 0x000000000173cf1b in StreamView::remove_region_view (this=0x7a36160, weak_r=...) at ../gtk2_ardour/streamview.cc:194 #19 0x0000000001024c4c in boost::_mfi::mf1<void, StreamView, boost::weak_ptr<ARDOUR::Region> >::call<AudioStreamView*, boost::weak_ptr<ARDOUR::Region> > (this=0x65d0060, u=@0x65d0070: 0x7a36160, b1=...) at /usr/include/boost/bind/mem_fn_template.hpp:156 #20 0x000000000102402c in boost::_mfi::mf1<void, StreamView, boost::weak_ptr<ARDOUR::Region> >::operator()<AudioStreamView*> (this=0x65d0060, u=@0x65d0070: 0x7a36160, a1=...) at /usr/include/boost/bind/mem_fn_template.hpp:171 #21 0x0000000001022f63 in boost::_bi::list2<boost::_bi::value<AudioStreamView*>, boost::_bi::value<boost::weak_ptr<ARDOUR::Region> > >::operator()<boost::_mfi::mf1<void, StreamView, boost::weak_ptr<ARDOUR::Region> >, boost::_bi::list0> (this=0x65d0070, f=..., a=...) at /usr/include/boost/bind/bind.hpp:313 #22 0x00000000010220db in boost::_bi::bind_t<void, boost::_mfi::mf1<void, StreamView, boost::weak_ptr<ARDOUR::Region> >, boost::_bi::list2<boost::_bi::value<AudioStreamView*>, boost::_bi::value<boost::weak_ptr<ARDOUR::Region> > > >::operator() (this=0x65d0060) at /usr/include/boost/bind/bind_template.hpp:20 #23 0x0000000001020e21 in boost::detail::function::void_function_obj_invoker0<boost::_bi::bind_t<void, boost::_mfi::mf1<void, StreamView, boost::weak_ptr<ARDOUR::Region> >, boost::_bi::list2<boost::_bi::value<AudioStreamView*>, boost::_bi::value<boost::weak_ptr<ARDOUR::Region> > > >, void>::invoke ( function_obj_ptr=...) at /usr/include/boost/function/function_template.hpp:153 #24 0x0000000000f519f0 in boost::function0<void>::operator() (this=0x6db8fb0) at /usr/include/boost/function/function_template.hpp:767 #25 0x0000000000f54fea in boost::_bi::list0::operator()<boost::function<void ()>, boost::_bi::list0>(boost::_bi::type<void>, boost::function<void ()>&, boost::_bi::list0&, int) (this=0x6db8fd0, f=...) at /usr/include/boost/bind/bind.hpp:192 #26 0x0000000000f546bb in boost::_bi::bind_t<boost::_bi::unspecified, boost::function<void ()>, boost::_bi::list0>::operator()() (this=0x6db8fb0) at /usr/include/boost/bind/bind_template.hpp:20 #27 0x0000000000f53aa4 in boost::detail::function::void_function_obj_invoker0<boost::_bi::bind_t<boost::_bi::unspecified, boost::function<void ()>, boost::_bi::list0>, void>::invoke(boost::detail::function::function_buffer&) (function_obj_ptr=...) at /usr/include/boost/function/function_template.hpp:153 #28 0x0000000000f519f0 in boost::function0<void>::operator() (this=0x7fffffffc1e0) at /usr/include/boost/function/function_template.hpp:767 #29 0x00007ffff5ba1255 in AbstractUI<Gtkmm2ext::UIRequest>::call_slot(PBD::EventLoop::InvalidationRecord*, boost::function<void ()> const&) (this=0x21c2500, invalidation=0x6db92e0, f=...) at /mnt/part/src/ardour/libs/pbd/pbd/abstract_ui.cc:372 #30 0x0000000000f50baa in PBD::Signal0<void, PBD::OptionalLastValue<void> >::compositor(boost::function<vo---Type <return> to continue, or q <return> to quit--- id ()>, PBD::EventLoop*, PBD::EventLoop::InvalidationRecord*) (f=..., event_loop=0x21c2500, ir=0x6db92e0) at /mnt/part/src/ardour/build/libs/pbd/pbd/signals_generated.h:203 #31 0x0000000000f55266 in boost::_bi::list3<boost::_bi::value<boost::function<void ()> >, boost::_bi::value<PBD::EventLoop*>, boost::_bi::value<PBD::EventLoop::InvalidationRecord*> >::operator()<void (*)(boost::function<void ()>, PBD::EventLoop*, PBD::EventLoop::InvalidationRecord*), boost::_bi::list0>(boost::_bi::type<void>, void (*&)(boost::function<void ()>, PBD::EventLoop*, PBD::EventLoop::InvalidationRecord*), boost::_bi::list0&, int) (this=0x69b5e08, f= @0x69b5e00: 0xf50b1d <PBD::Signal0<void, PBD::OptionalLastValue<void> >::compositor(boost::function<void ()>, PBD::EventLoop*, PBD::EventLoop::InvalidationRecord*)>, a=...) at /usr/include/boost/bind/bind.hpp:392 #32 0x0000000000f54803 in boost::_bi::bind_t<void, void (*)(boost::function<void ()>, PBD::EventLoop*, PBD::EventLoop::InvalidationRecord*), boost::_bi::list3<boost::_bi::value<boost::function<void ()> >, boost::_bi::value<PBD::EventLoop*>, boost::_bi::value<PBD::EventLoop::InvalidationRecord*> > >::operator()() ( this=0x69b5e00) at /usr/include/boost/bind/bind_template.hpp:20 #33 0x0000000000f53c16 in boost::detail::function::void_function_obj_invoker0<boost::_bi::bind_t<void, void (*)(boost::function<void ()>, PBD::EventLoop*, PBD::EventLoop::InvalidationRecord*), boost::_bi::list3<boost::_bi::value<boost::function<void ()> >, boost::_bi::value<PBD::EventLoop*>, boost::_bi::value<PBD::EventLoop::InvalidationRecord*> > >, void>::invoke(boost::detail::function::function_buffer&) ( function_obj_ptr=...) at /usr/include/boost/function/function_template.hpp:153 #34 0x0000000000f519f0 in boost::function0<void>::operator() (this=0x7aa4550) at /usr/include/boost/function/function_template.hpp:767 #35 0x0000000000f7919e in PBD::Signal0<void, PBD::OptionalLastValue<void> >::operator() (this=0x7f13f80) at /mnt/part/src/ardour/build/libs/pbd/pbd/signals_generated.h:312 #36 0x000000000100a474 in PBD::Destructible::drop_references (this=0x7f13f30) at /mnt/part/src/ardour/libs/pbd/pbd/destructible.h:36 #37 0x000000000101a4e6 in AudioStreamView::setup_rec_box (this=0x7a36160) at ../gtk2_ardour/audio_streamview.cc:268 #38 0x000000000173e51b in StreamView::sess_rec_enable_changed (this=0x7a36160) at ../gtk2_ardour/streamview.cc:391 #39 0x0000000001743d79 in boost::_mfi::mf0<void, StreamView>::operator() (this=0x7fffa4036dd8, p=0x7a36160) at /usr/include/boost/bind/mem_fn_template.hpp:49 #40 0x0000000001743404 in boost::_bi::list1<boost::_bi::value<StreamView*> >::operator()<boost::_mfi::mf0<void, StreamView>, boost::_bi::list0> (this=0x7fffa4036de8, f=..., a=...) at /usr/include/boost/bind/bind.hpp:253 |
|
Thanks for the patch. I've applied a modified version if it in eff25b06f5fe. |
|
Now it works, thanks. |
|
fixed in eff25b0 |
|
I've committed a different fix in 8962bfba Testing would be appreciated. |
|
Issue has been closed automatically, by Trigger Close Plugin. Feel free to re-open with additional information if you think the issue is not resolved. |
Date Modified | Username | Field | Change |
---|---|---|---|
2015-02-26 16:40 | tlat | New Issue | |
2015-02-26 16:40 | tlat | File Added: stop_and_forget_capture.patch | |
2015-02-26 16:41 | tlat | File Added: bt.log | |
2015-03-24 13:46 | nick_m | Note Added: 0016475 | |
2015-03-24 20:47 | tlat | Note Added: 0016484 | |
2015-03-24 20:48 | tlat | Note Added: 0016485 | |
2015-03-24 20:48 | tlat | Status | new => resolved |
2015-03-24 20:48 | tlat | Resolution | open => fixed |
2015-03-24 20:48 | tlat | Assigned To | => tlat |
2015-03-28 15:19 | nick_m | Note Added: 0016507 | |
2020-04-19 20:17 | system | Note Added: 0023408 | |
2020-04-19 20:17 | system | Status | resolved => closed |