From c5cda446e04b6abeadf417c32eaec6e8640c9ca4 Mon Sep 17 00:00:00 2001 From: Julien ROGER Date: Fri, 2 Dec 2016 06:17:51 +0100 Subject: Fix crash when track creation failed draging region Add more check when creating a new track from a region drag into editor's empty area. Fix #6496 --- gtk2_ardour/editor_drag.cc | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 018c8c1f38..3008ae590f 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -1425,7 +1425,7 @@ RegionMoveDrag::create_destination_time_axis (boost::shared_ptr region, /* Add a new track of the correct type, and return the RouteTimeAxisView that is created to display the new track. */ - + TimeAxisView* tav = 0; try { if (boost::dynamic_pointer_cast (region)) { list > audio_tracks; @@ -1434,27 +1434,24 @@ RegionMoveDrag::create_destination_time_axis (boost::shared_ptr region, output_chan = _editor->session()->master_out()->n_inputs().n_audio(); } audio_tracks = _editor->session()->new_audio_track (region->n_channels(), output_chan, 0, 1, region->name(), PresentationInfo::max_order); - TimeAxisView* tav =_editor->axis_view_from_stripable (audio_tracks.front()); - if (tav) { - tav->set_height (original->current_height()); - } - return dynamic_cast(tav); + tav =_editor->axis_view_from_stripable (audio_tracks.front()); } else { ChanCount one_midi_port (DataType::MIDI, 1); list > midi_tracks; midi_tracks = _editor->session()->new_midi_track (one_midi_port, one_midi_port, boost::shared_ptr(), (ARDOUR::Plugin::PresetRecord*) 0, (ARDOUR::RouteGroup*) 0, 1, region->name(), PresentationInfo::max_order); - TimeAxisView* tav = _editor->axis_view_from_stripable (midi_tracks.front()); - if (tav) { - tav->set_height (original->current_height()); - } - return dynamic_cast (tav); + tav = _editor->axis_view_from_stripable (midi_tracks.front()); + } + + if (tav) { + tav->set_height (original->current_height()); } } catch (...) { error << _("Could not create new track after region placed in the drop zone") << endmsg; - return 0; } + + return dynamic_cast (tav); } void @@ -1503,6 +1500,10 @@ RegionMoveDrag::finished_copy (bool const changed_position, bool const /*changed if ((pm = playlist_mapping.find (i->view->region()->playlist())) == playlist_mapping.end()) { /* first region from this original playlist: create a new track */ new_time_axis_view = create_destination_time_axis (i->view->region(), i->initial_time_axis_view); + if(!new_time_axis_view) { + Drag::abort(); + return; + } playlist_mapping.insert (make_pair (i->view->region()->playlist(), new_time_axis_view)); dest_rtv = new_time_axis_view; } else { @@ -1590,6 +1591,10 @@ RegionMoveDrag::finished_no_copy ( if ((pm = playlist_mapping.find (i->view->region()->playlist())) == playlist_mapping.end()) { /* first region from this original playlist: create a new track */ new_time_axis_view = create_destination_time_axis (i->view->region(), i->initial_time_axis_view); + if(!new_time_axis_view) { // New track creation failed + Drag::abort(); + return; + } playlist_mapping.insert (make_pair (i->view->region()->playlist(), new_time_axis_view)); dest_rtv = new_time_axis_view; } else { -- cgit v1.2.3