Don't allow drawing notes in rec regions (crash).

This commit is contained in:
David Robillard 2014-12-17 02:34:30 -05:00
parent ec6626f06a
commit 5ee4a5d56a
3 changed files with 29 additions and 21 deletions

View file

@ -142,8 +142,9 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent,
boost::shared_ptr<MidiRegion> r, boost::shared_ptr<MidiRegion> r,
double spu, double spu,
uint32_t basic_color, uint32_t basic_color,
bool recording,
TimeAxisViewItem::Visibility visibility) TimeAxisViewItem::Visibility visibility)
: RegionView (parent, tv, r, spu, basic_color, false, visibility) : RegionView (parent, tv, r, spu, basic_color, recording, visibility)
, _current_range_min(0) , _current_range_min(0)
, _current_range_max(0) , _current_range_max(0)
, _region_relative_time_converter(r->session().tempo_map(), r->position()) , _region_relative_time_converter(r->session().tempo_map(), r->position())
@ -340,7 +341,7 @@ MidiRegionView::connect_to_diskstream ()
bool bool
MidiRegionView::canvas_group_event(GdkEvent* ev) MidiRegionView::canvas_group_event(GdkEvent* ev)
{ {
if (in_destructor) { if (in_destructor || _recregion) {
return false; return false;
} }

View file

@ -68,11 +68,20 @@ public:
typedef Evoral::Note<Evoral::MusicalTime> NoteType; typedef Evoral::Note<Evoral::MusicalTime> NoteType;
typedef Evoral::Sequence<Evoral::MusicalTime>::Notes Notes; typedef Evoral::Sequence<Evoral::MusicalTime>::Notes Notes;
MidiRegionView (ArdourCanvas::Container *, MidiRegionView (ArdourCanvas::Container* parent,
RouteTimeAxisView&, RouteTimeAxisView& tv,
boost::shared_ptr<ARDOUR::MidiRegion>, boost::shared_ptr<ARDOUR::MidiRegion> r,
double initial_samples_per_pixel, double samples_per_pixel,
uint32_t base_color); uint32_t basic_color);
MidiRegionView (ArdourCanvas::Container* parent,
RouteTimeAxisView& tv,
boost::shared_ptr<ARDOUR::MidiRegion> r,
double samples_per_pixel,
uint32_t basic_color,
bool recording,
Visibility visibility);
MidiRegionView (const MidiRegionView& other); MidiRegionView (const MidiRegionView& other);
MidiRegionView (const MidiRegionView& other, boost::shared_ptr<ARDOUR::MidiRegion>); MidiRegionView (const MidiRegionView& other, boost::shared_ptr<ARDOUR::MidiRegion>);
@ -322,16 +331,6 @@ public:
ARDOUR::InstrumentInfo& instrument_info() const; ARDOUR::InstrumentInfo& instrument_info() const;
protected: protected:
/** Allows derived types to specify their visibility requirements
* to the TimeAxisViewItem parent class.
*/
MidiRegionView (ArdourCanvas::Container *,
RouteTimeAxisView&,
boost::shared_ptr<ARDOUR::MidiRegion>,
double samples_per_pixel,
uint32_t basic_color,
TimeAxisViewItem::Visibility);
void region_resized (const PBD::PropertyChange&); void region_resized (const PBD::PropertyChange&);
void set_flags (XMLNode *); void set_flags (XMLNode *);

View file

@ -100,7 +100,7 @@ MidiStreamView::~MidiStreamView ()
} }
RegionView* RegionView*
MidiStreamView::create_region_view (boost::shared_ptr<Region> r, bool /*wfd*/, bool) MidiStreamView::create_region_view (boost::shared_ptr<Region> r, bool /*wfd*/, bool recording)
{ {
boost::shared_ptr<MidiRegion> region = boost::dynamic_pointer_cast<MidiRegion> (r); boost::shared_ptr<MidiRegion> region = boost::dynamic_pointer_cast<MidiRegion> (r);
@ -108,8 +108,16 @@ MidiStreamView::create_region_view (boost::shared_ptr<Region> r, bool /*wfd*/, b
return 0; return 0;
} }
RegionView* region_view = new MidiRegionView (_canvas_group, _trackview, region, RegionView* region_view = NULL;
_samples_per_pixel, region_color); if (recording) {
region_view = new MidiRegionView (
_canvas_group, _trackview, region,
_samples_per_pixel, region_color, recording,
TimeAxisViewItem::Visibility(TimeAxisViewItem::ShowFrame));
} else {
region_view = new MidiRegionView (_canvas_group, _trackview, region,
_samples_per_pixel, region_color);
}
region_view->init (false); region_view->init (false);
@ -488,7 +496,7 @@ MidiStreamView::setup_rec_box ()
region->set_start (_trackview.track()->current_capture_start() region->set_start (_trackview.track()->current_capture_start()
- _trackview.track()->get_capture_start_frame (0)); - _trackview.track()->get_capture_start_frame (0));
region->set_position (_trackview.track()->current_capture_start()); region->set_position (_trackview.track()->current_capture_start());
RegionView* rv = add_region_view_internal (region, false); RegionView* rv = add_region_view_internal (region, false, true);
MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (rv); MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (rv);
mrv->begin_write (); mrv->begin_write ();