From 832aa18a813f5ed4cb8e1228c52d89ee6d8946c7 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 25 Jan 2010 20:34:09 +0000 Subject: [PATCH] a boatload of minor and middle-sized changes to try to speed up undo. imperfect, unfinished, but probably right to commit now git-svn-id: svn://localhost/ardour2/branches/3.0@6561 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/add_route_dialog.cc | 2 +- gtk2_ardour/audio_streamview.cc | 61 +++++------- gtk2_ardour/audio_streamview.h | 9 +- gtk2_ardour/editor.cc | 7 +- gtk2_ardour/editor_actions.cc | 1 + gtk2_ardour/editor_drag.cc | 11 +-- gtk2_ardour/editor_mouse.cc | 7 +- gtk2_ardour/editor_regions.cc | 41 +++++--- gtk2_ardour/editor_regions.h | 2 + gtk2_ardour/editor_selection.cc | 2 + gtk2_ardour/enums.cc | 13 +++ gtk2_ardour/midi_tracer.h | 1 - gtk2_ardour/processor_box.cc | 5 +- gtk2_ardour/streamview.cc | 56 ++++------- gtk2_ardour/streamview.h | 11 +-- libs/ardour/ardour/playlist.h | 9 +- libs/ardour/audio_diskstream.cc | 2 +- libs/ardour/audio_playlist.cc | 4 +- libs/ardour/audioregion.cc | 45 +++++++-- libs/ardour/automation_list.cc | 1 + libs/ardour/crossfade.cc | 6 +- libs/ardour/diskstream.cc | 2 +- libs/ardour/midi_playlist.cc | 2 +- libs/ardour/playlist.cc | 169 +++++++++++++++++++++----------- libs/ardour/region.cc | 13 ++- libs/pbd/undo.cc | 1 + 26 files changed, 289 insertions(+), 194 deletions(-) diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc index a3d3deaea5..47eeb94320 100644 --- a/gtk2_ardour/add_route_dialog.cc +++ b/gtk2_ardour/add_route_dialog.cc @@ -366,7 +366,7 @@ AddRouteDialog::refill_channel_setups () chn.channels = 12; channel_setups.push_back (chn); - chn.name = X_("Custom"); + chn.name = _("Custom"); chn.channels = 0; channel_setups.push_back (chn); } diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc index fe4d601e3f..b6abbb4b22 100644 --- a/gtk2_ardour/audio_streamview.cc +++ b/gtk2_ardour/audio_streamview.cc @@ -24,6 +24,8 @@ #include +#include "pbd/stacktrace.h" + #include "ardour/audioplaylist.h" #include "ardour/audioregion.h" #include "ardour/audiofilesource.h" @@ -202,14 +204,14 @@ AudioStreamView::remove_region_view (boost::weak_ptr weak_r) { ENSURE_GUI_THREAD (*this, &AudioStreamView::remove_region_view, weak_r); - cerr << "a region went way, it appears to be ours (" << this << ")\n"; - boost::shared_ptr r (weak_r.lock()); if (!r) { return; } + cerr << "a region went way, it appears to be ours (" << this << ")\n"; + if (!_trackview.session()->deletion_in_progress()) { for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end();) { @@ -244,46 +246,41 @@ AudioStreamView::undisplay_diskstream () } void -AudioStreamView::playlist_modified_weak (boost::weak_ptr ds) +AudioStreamView::playlist_layered (boost::weak_ptr wds) { - boost::shared_ptr sp (ds.lock()); - if (sp) { - playlist_modified (sp); + boost::shared_ptr ds (wds.lock()); + + if (!ds) { + return; } -} -void -AudioStreamView::playlist_modified (boost::shared_ptr ds) -{ - /* we do not allow shared_ptr to be bound to slots */ - ENSURE_GUI_THREAD (*this, &AudioStreamView::playlist_modified_weak, ds) + cerr << "AS, call SV::modified @ " << get_microseconds() << endl; - StreamView::playlist_modified (ds); + StreamView::playlist_layered (wds); + + cerr << "AS, done with SV::modified @ " << get_microseconds() << endl; /* make sure xfades are on top and all the regionviews are stacked correctly. */ + cerr << "AS, raise xfades @ " << get_microseconds() << endl; for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) { i->second->get_canvas_group()->raise_to_top(); } + cerr << "AS, done with xfades @ " << get_microseconds() << endl; } void -AudioStreamView::playlist_changed_weak (boost::weak_ptr ds) +AudioStreamView::playlist_switched (boost::weak_ptr wds) { - boost::shared_ptr sp (ds.lock()); - if (sp) { - playlist_changed (sp); + boost::shared_ptr ds (wds.lock()); + + if (!ds) { + return; } -} - -void -AudioStreamView::playlist_changed (boost::shared_ptr ds) -{ - ENSURE_GUI_THREAD (*this, &AudioStreamView::playlist_changed_weak, boost::weak_ptr (ds)); playlist_connections.drop_connections (); - StreamView::playlist_changed(ds); + StreamView::playlist_switched (ds); boost::shared_ptr apl = boost::dynamic_pointer_cast(ds->playlist()); @@ -293,27 +290,17 @@ AudioStreamView::playlist_changed (boost::shared_ptr ds) } void -AudioStreamView::add_crossfade_weak (boost::weak_ptr crossfade) +AudioStreamView::add_crossfade (boost::weak_ptr wc) { - boost::shared_ptr sp (crossfade.lock()); + boost::shared_ptr crossfade (wc.lock()); - if (!sp) { + if (!crossfade) { return; } - add_crossfade (sp); -} - -void -AudioStreamView::add_crossfade (boost::shared_ptr crossfade) -{ AudioRegionView* lview = 0; AudioRegionView* rview = 0; - /* we do not allow shared_ptr to be bound to slots */ - - ENSURE_GUI_THREAD (*this, &AudioStreamView::add_crossfade_weak, boost::weak_ptr (crossfade)); - /* first see if we already have a CrossfadeView for this Crossfade */ CrossfadeViewList::iterator i = crossfade_views.find (crossfade); diff --git a/gtk2_ardour/audio_streamview.h b/gtk2_ardour/audio_streamview.h index d17a67f23c..ce21c7dacb 100644 --- a/gtk2_ardour/audio_streamview.h +++ b/gtk2_ardour/audio_streamview.h @@ -88,13 +88,10 @@ class AudioStreamView : public StreamView void undisplay_diskstream (); void redisplay_diskstream (); - void playlist_modified_weak (boost::weak_ptr); - void playlist_modified (boost::shared_ptr); - void playlist_changed_weak (boost::weak_ptr); - void playlist_changed (boost::shared_ptr); + void playlist_layered (boost::weak_ptr); + void playlist_switched (boost::weak_ptr); - void add_crossfade (boost::shared_ptr); - void add_crossfade_weak (boost::weak_ptr); + void add_crossfade (boost::weak_ptr); void remove_crossfade (boost::shared_ptr); void color_handler (); diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 3c7bd3f37c..387c61ecc6 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -2198,6 +2198,8 @@ Editor::set_state (const XMLNode& node, int /*version*/) int x, y, xoff, yoff; Gdk::Geometry g; + // return 0; + if ((prop = node.property ("id")) != 0) { _id = prop->value (); } @@ -2355,7 +2357,8 @@ Editor::set_state (const XMLNode& node, int /*version*/) } if ((prop = node.property ("region-list-sort-type"))) { - _regions->reset_sort_type (str2regionlistsorttype(prop->value()), true); + RegionListSortType st; + _regions->reset_sort_type ((RegionListSortType) string_2_enum (prop->value(), st), true); } if ((prop = node.property ("xfades-visible"))) { @@ -2458,7 +2461,7 @@ Editor::get_state () node->add_property ("show-measures", _show_measures ? "yes" : "no"); node->add_property ("follow-playhead", _follow_playhead ? "yes" : "no"); node->add_property ("xfades-visible", _xfade_visibility ? "yes" : "no"); - node->add_property ("region-list-sort-type", enum2str (_regions->sort_type ())); + node->add_property ("region-list-sort-type", enum_2_string (_regions->sort_type ())); node->add_property ("mouse-mode", enum2str(mouse_mode)); node->add_property ("internal-edit", _internal_editing ? "yes" : "no"); node->add_property ("join-object-range", join_object_range_button.get_active () ? "yes" : "no"); diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 1b2654561c..64495fb2ff 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -340,6 +340,7 @@ Editor::register_actions () ActionManager::region_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "set-punch-from-edit-range", _("Set Punch from Edit Range"), sigc::mem_fun(*this, &Editor::set_punch_from_edit_range)); ActionManager::session_sensitive_actions.push_back (act); + ActionManager::region_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "set-punch-from-region", _("Set Punch From Region"), sigc::mem_fun(*this, &Editor::set_punch_from_region)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::region_selection_sensitive_actions.push_back (act); diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index ab5aa45cb3..8f59b9e699 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -1003,20 +1003,19 @@ RegionMoveDrag::finished (GdkEvent* /*event*/, bool movement_occurred) rv->region()->set_layer (dest_layer); rv->region()->set_pending_explicit_relayer (true); } + + /* freeze playlist to avoid lots of relayering in the case of a multi-region drag */ - insert_result = modified_playlists.insert (playlist); - - if (insert_result.second) { - _editor->session()->add_command (new MementoCommand(*playlist, &playlist->get_state(), 0)); - } - /* freeze to avoid lots of relayering in the case of a multi-region drag */ frozen_insert_result = frozen_playlists.insert(playlist); if (frozen_insert_result.second) { playlist->freeze(); } + XMLNode& before (rv->region()->get_state()); rv->region()->set_position (where, (void*) this); + _editor->session()->add_command (new MementoCommand(*rv->region(), &before, &playlist->get_state())); + } if (changed_tracks && !_copy) { diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index c3b4528876..64d1bf39f7 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -2454,13 +2454,14 @@ Editor::mouse_brush_insert_region (RegionView* rv, nframes64_t pos) double speed = rtv->get_diskstream()->speed(); XMLNode &before = playlist->get_state(); - playlist->add_region (RegionFactory::create (rv->region()), (nframes64_t) (pos * speed)); + boost::shared_ptr new_region (RegionFactory::create (rv->region())); + playlist->add_region (new_region, (nframes64_t) (pos * speed)); XMLNode &after = playlist->get_state(); _session->add_command(new MementoCommand(*playlist.get(), &before, &after)); - // playlist is frozen, so we have to update manually + // playlist is frozen, so we have to update manually XXX this is disgusting - playlist->Modified(); /* EMIT SIGNAL */ + playlist->RegionAdded (new_region); /* EMIT SIGNAL */ } gint diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc index 490f6991e3..58a0a5d7e7 100644 --- a/gtk2_ardour/editor_regions.cc +++ b/gtk2_ardour/editor_regions.cc @@ -24,6 +24,7 @@ #include #include "pbd/basename.h" +#include "pbd/enumwriter.h" #include "ardour/audioregion.h" #include "ardour/audiofilesource.h" @@ -54,11 +55,13 @@ using namespace Editing; using Gtkmm2ext::Keyboard; EditorRegions::EditorRegions (Editor* e) - : EditorComponent (e), - _menu (0), - _show_automatic_regions (true), - _sort_type ((Editing::RegionListSortType) 0), - _no_redisplay (false) + : EditorComponent (e) + , _menu (0) + , _show_automatic_regions (true) + , _sort_type ((Editing::RegionListSortType) 0) + , _no_redisplay (false) + , ignore_region_list_selection_change (false) + , ignore_selected_region_change (false) { _display.set_size_request (100, -1); _display.set_name ("RegionListDisplay"); @@ -383,37 +386,42 @@ EditorRegions::region_changed (Change what_changed, boost::weak_ptr regi void EditorRegions::selection_changed () { + if (ignore_region_list_selection_change) { + return; + } + if (_display.get_selection()->count_selected_rows() > 0) { TreeIter iter; TreeView::Selection::ListHandle_Path rows = _display.get_selection()->get_selected_rows (); - _editor->deselect_all (); + _editor->get_selection().clear_regions (); for (TreeView::Selection::ListHandle_Path::iterator i = rows.begin(); i != rows.end(); ++i) { - if (iter = _model->get_iter (*i)) { // they could have clicked on a row that is just a placeholder, like "Hidden" + if (iter = _model->get_iter (*i)) { boost::shared_ptr region = (*iter)[_columns.region]; + // they could have clicked on a row that is just a placeholder, like "Hidden" + if (region) { if (region->automatic()) { + _display.get_selection()->unselect(*i); } else { _change_connection.block (true); - //editor_regions_selection_changed_connection.block(true); - + cerr << "\tpush to region selection\n"; _editor->set_selected_regionview_from_region_list (region, Selection::Add); _change_connection.block (false); - //editor_regions_selection_changed_connection.block(false); } } } } } else { - _editor->deselect_all (); + _editor->get_selection().clear_regions (); } } @@ -431,11 +439,13 @@ EditorRegions::set_selected (RegionSelection& regions) boost::shared_ptr compared_region = (*i)[_columns.region]; if (r == compared_region) { + cerr << "\tpush into region list\n"; _display.get_selection()->select(*i); break; } if (!(*i).children().empty()) { + cerr << "\tlook for " << r->name() << " among children of " << (compared_region ? compared_region->name() : string ("NO REGION")) << endl; if (set_selected_in_subrow(r, (*i), 2)) { break; } @@ -524,6 +534,8 @@ EditorRegions::update_row (boost::shared_ptr region) TreeModel::iterator i; TreeModel::Children rows = _model->children(); + + return; for (i = rows.begin(); i != rows.end(); ++i) { @@ -543,6 +555,7 @@ EditorRegions::update_row (boost::shared_ptr region) } } } + // cerr << "Returning - No match\n"; } @@ -570,6 +583,7 @@ EditorRegions::update_subrows (boost::shared_ptr region, TreeModel::Row } } } + return false; } @@ -579,7 +593,7 @@ EditorRegions::update_all_rows () if (!_session) { return; } - + TreeModel::iterator i; TreeModel::Children rows = _model->children(); @@ -1049,6 +1063,7 @@ EditorRegions::sorter (TreeModel::iterator a, TreeModel::iterator b) break; case ByEndInFile: + // cerr << "Compare " << (region1->start() + region1->length()) << " and " << (region2->start() + region2->length()) << endl; cmp = (region1->start() + region1->length()) - (region2->start() + region2->length()); break; @@ -1073,6 +1088,8 @@ EditorRegions::sorter (TreeModel::iterator a, TreeModel::iterator b) break; } + // cerr << "Comparison on " << enum_2_string (_sort_type) << " gives " << cmp << endl; + if (cmp < 0) { return -1; } else if (cmp > 0) { diff --git a/gtk2_ardour/editor_regions.h b/gtk2_ardour/editor_regions.h index 83fd91aaca..5a9c2aad5a 100644 --- a/gtk2_ardour/editor_regions.h +++ b/gtk2_ardour/editor_regions.h @@ -150,6 +150,8 @@ private: bool _no_redisplay; std::list > tmp_region_list; PBD::ScopedConnection region_property_connection; + bool ignore_region_list_selection_change; + bool ignore_selected_region_change; }; #endif /* __gtk_ardour_editor_regions_h__ */ diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index 4c4b4f0c86..2b94a05619 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -870,6 +870,8 @@ Editor::region_selection_changed () _regions->block_change_connection (true); editor_regions_selection_changed_connection.block(true); + _regions->unselect_all (); + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { (*i)->set_selected_regionviews (selection->regions); } diff --git a/gtk2_ardour/enums.cc b/gtk2_ardour/enums.cc index 4820a930ac..4b20514175 100644 --- a/gtk2_ardour/enums.cc +++ b/gtk2_ardour/enums.cc @@ -40,6 +40,7 @@ setup_gtk_ardour_enums () ImportMode import_mode; EditPoint edit_point; LayerDisplay layer_display; + RegionListSortType region_list_sort_type; #define REGISTER(e) enum_writer.register_distinct (typeid(e).name(), i, s); i.clear(); s.clear() #define REGISTER_BITS(e) enum_writer.register_bits (typeid(e).name(), i, s); i.clear(); s.clear() @@ -71,4 +72,16 @@ setup_gtk_ardour_enums () REGISTER_ENUM (Overlaid); REGISTER_ENUM (Stacked); REGISTER (layer_display); + + REGISTER_ENUM (ByEndInFile); + REGISTER_ENUM (ByLength); + REGISTER_ENUM (ByName); + REGISTER_ENUM (ByPosition); + REGISTER_ENUM (BySourceFileCreationDate); + REGISTER_ENUM (BySourceFileFS); + REGISTER_ENUM (BySourceFileLength); + REGISTER_ENUM (BySourceFileName); + REGISTER_ENUM (ByStartInFile); + REGISTER_ENUM (ByTimestamp); + REGISTER (region_list_sort_type); } diff --git a/gtk2_ardour/midi_tracer.h b/gtk2_ardour/midi_tracer.h index fc6abee15c..58cdd6776e 100644 --- a/gtk2_ardour/midi_tracer.h +++ b/gtk2_ardour/midi_tracer.h @@ -1,7 +1,6 @@ #ifndef __ardour_gtk_midi_tracer_h__ #define __ardour_gtk_midi_tracer_h__ -#include #include #include #include diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 07d2a4e6d4..7324541ae2 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -1019,10 +1019,11 @@ ProcessorBox::compute_processor_sort_keys () Label label; label.set_text (_("\ -You cannot reorder this set of processors\n\ +You cannot reorder these plugins/sends/inserts\n\ in that way because the inputs and\n\ -outputs do not work correctly.")); +outputs will not work correctly.")); + dialog.get_vbox()->set_border_width (12); dialog.get_vbox()->pack_start (label); dialog.add_button (Stock::OK, RESPONSE_ACCEPT); diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index b93606fbe8..da773ea273 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -169,20 +169,12 @@ StreamView::set_samples_per_unit (gdouble spp) } void -StreamView::add_region_view_weak (boost::weak_ptr r) +StreamView::add_region_view (boost::weak_ptr wr) { - boost::shared_ptr sp (r.lock()); - - if (sp) { - add_region_view (sp); + boost::shared_ptr r (wr.lock()); + if (!r) { + return; } -} - - -void -StreamView::add_region_view (boost::shared_ptr r) -{ - ENSURE_GUI_THREAD (*this, &StreamView::add_region_view_weak, boost::weak_ptr(r)); add_region_view_internal (r, true); @@ -229,9 +221,9 @@ StreamView::undisplay_diskstream () void StreamView::display_diskstream (boost::shared_ptr ds) { - playlist_change_connection.disconnect(); - playlist_changed (ds); - ds->PlaylistChanged.connect (playlist_change_connection, boost::bind (&StreamView::playlist_changed_weak, this, boost::weak_ptr (ds)), gui_context()); + playlist_switched_connection.disconnect(); + playlist_switched (ds); + ds->PlaylistChanged.connect (playlist_switched_connection, boost::bind (&StreamView::playlist_switched, this, boost::weak_ptr (ds)), gui_context()); } void @@ -292,20 +284,13 @@ StreamView::layer_regions() } void -StreamView::playlist_modified_weak (boost::weak_ptr ds) +StreamView::playlist_layered (boost::weak_ptr wds) { - boost::shared_ptr sp (ds.lock()); + boost::shared_ptr ds (wds.lock()); - if (sp) { - playlist_modified (sp); + if (!ds) { + return; } -} - -void -StreamView::playlist_modified (boost::shared_ptr ds) -{ - /* we do not allow shared_ptr to be bound to slots */ - ENSURE_GUI_THREAD (*this, &StreamView::playlist_modified_weak, ds) /* update layers count and the y positions and heights of our regions */ if (ds->playlist()) { @@ -322,18 +307,13 @@ StreamView::playlist_modified (boost::shared_ptr ds) } void -StreamView::playlist_changed_weak (boost::weak_ptr ds) +StreamView::playlist_switched (boost::weak_ptr wds) { - boost::shared_ptr sp (ds.lock()); - if (sp) { - playlist_changed (sp); - } -} + boost::shared_ptr ds (wds.lock()); -void -StreamView::playlist_changed (boost::shared_ptr ds) -{ - ENSURE_GUI_THREAD (*this, &StreamView::playlist_changed_weak, boost::weak_ptr (ds)); + if (!ds) { + return; + } /* disconnect from old playlist */ @@ -353,8 +333,8 @@ StreamView::playlist_changed (boost::shared_ptr ds) /* catch changes */ - ds->playlist()->Modified.connect (playlist_connections, boost::bind (&StreamView::playlist_modified_weak, this, ds), gui_context()); - ds->playlist()->RegionAdded.connect (playlist_connections, ui_bind (&StreamView::add_region_view_weak, this, _1), gui_context()); + ds->playlist()->LayeringChanged.connect (playlist_connections, boost::bind (&StreamView::playlist_layered, this, boost::weak_ptr(ds)), gui_context()); + ds->playlist()->RegionAdded.connect (playlist_connections, ui_bind (&StreamView::add_region_view, this, _1), gui_context()); ds->playlist()->RegionRemoved.connect (playlist_connections, ui_bind (&StreamView::remove_region_view, this, _1), gui_context()); } diff --git a/gtk2_ardour/streamview.h b/gtk2_ardour/streamview.h index b32d75d5ac..a1ebe2cc2a 100644 --- a/gtk2_ardour/streamview.h +++ b/gtk2_ardour/streamview.h @@ -99,8 +99,7 @@ public: virtual void update_contents_metrics(boost::shared_ptr) {} - void add_region_view_weak (boost::weak_ptr r); - void add_region_view (boost::shared_ptr); + void add_region_view (boost::weak_ptr); void region_layered (RegionView*); virtual void update_contents_height (); @@ -135,10 +134,8 @@ protected: void diskstream_changed (); void layer_regions (); - virtual void playlist_changed_weak (boost::weak_ptr); - virtual void playlist_changed (boost::shared_ptr); - virtual void playlist_modified_weak (boost::weak_ptr); - virtual void playlist_modified (boost::shared_ptr); + virtual void playlist_switched (boost::weak_ptr); + virtual void playlist_layered (boost::weak_ptr); virtual void color_handler () = 0; @@ -164,7 +161,7 @@ protected: uint32_t stream_base_color; ///< Background color PBD::ScopedConnectionList playlist_connections; - PBD::ScopedConnection playlist_change_connection; + PBD::ScopedConnection playlist_switched_connection; ARDOUR::layer_t _layers; LayerDisplay _layer_display; diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index 8bcdc5540b..fb734458d5 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -130,11 +130,12 @@ class Playlist : public SessionObject XMLNode& get_template (); PBD::Signal1 InUse; - PBD::Signal0 Modified; + PBD::Signal0 ContentsChanged; PBD::Signal1 > RegionAdded; PBD::Signal1 > RegionRemoved; PBD::Signal0 NameChanged; PBD::Signal0 LengthChanged; + PBD::Signal0 LayeringChanged; PBD::Signal1 > const &> RangesMoved; static std::string bump_name (std::string old_name, Session&); @@ -201,7 +202,8 @@ class Playlist : public SessionObject std::set > pending_adds; std::set > pending_removes; RegionList pending_bounds; - bool pending_modified; + bool pending_contents_change; + bool pending_layering; bool pending_length; std::list< Evoral::RangeMove > pending_range_moves; bool save_on_thaw; @@ -240,12 +242,13 @@ class Playlist : public SessionObject void delay_notifications (); void release_notifications (); virtual void flush_notifications (); + void clear_pending (); void notify_region_removed (boost::shared_ptr); void notify_region_added (boost::shared_ptr); void notify_length_changed (); void notify_layering_changed (); - void notify_modified (); + void notify_contents_changed (); void notify_state_changed (Change); void notify_region_moved (boost::shared_ptr); diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index fb225671e9..db1a343d17 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -1451,7 +1451,7 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca process. this problem is deferred to the UI. */ - _playlist->Modified(); + _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing } else { diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc index 1ecba28653..7f75d44852 100644 --- a/libs/ardour/audio_playlist.cc +++ b/libs/ardour/audio_playlist.cc @@ -738,7 +738,7 @@ AudioPlaylist::crossfade_changed (Change) that occured. */ - notify_modified (); + notify_contents_changed (); } bool @@ -760,7 +760,7 @@ AudioPlaylist::region_changed (Change what_changed, boost::shared_ptr re parent_wants_notify = Playlist::region_changed (what_changed, region); if ((parent_wants_notify || (what_changed & our_interests))) { - notify_modified (); + notify_contents_changed (); } return true; diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index 5a99c164d9..729398cf21 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -294,6 +294,8 @@ AudioRegion::connect_to_header_position_offset_changed () void AudioRegion::listen_to_my_curves () { + cerr << _name << ": listeing my own curves\n"; + _envelope->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::envelope_changed, this)); _fade_in->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::fade_in_changed, this)); _fade_out->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::fade_out_changed, this)); @@ -637,8 +639,15 @@ AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_chan const XMLNodeList& nlist = node.children(); const XMLProperty *prop; LocaleGuard lg (X_("POSIX")); + boost::shared_ptr the_playlist (_playlist.lock()); + + freeze (); + if (the_playlist) { + the_playlist->freeze (); + } Region::set_live_state (node, version, what_changed, false); + cerr << "After region SLS, wc = " << what_changed << endl; uint32_t old_flags = _flags; @@ -661,23 +670,32 @@ AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_chan if ((old_flags ^ _flags) & Muted) { what_changed = Change (what_changed|MuteChanged); + cerr << _name << " mute changed\n"; } if ((old_flags ^ _flags) & Opaque) { what_changed = Change (what_changed|OpacityChanged); + cerr << _name << " opacity changed\n"; } if ((old_flags ^ _flags) & Locked) { what_changed = Change (what_changed|LockChanged); + cerr << _name << " lock changed\n"; } if ((prop = node.property ("scale-gain")) != 0) { - _scale_amplitude = atof (prop->value().c_str()); - what_changed = Change (what_changed|ScaleAmplitudeChanged); + float a = atof (prop->value().c_str()); + if (a != _scale_amplitude) { + _scale_amplitude = a; + what_changed = Change (what_changed|ScaleAmplitudeChanged); + cerr << _name << " amp changed\n"; + } } else { _scale_amplitude = 1.0; } /* Now find envelope description and other misc child items */ + _envelope->freeze (); + for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) { XMLNode *child; @@ -685,6 +703,7 @@ AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_chan child = (*niter); +#if 0 if (child->name() == "Envelope") { _envelope->clear (); @@ -696,6 +715,9 @@ AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_chan _envelope->set_max_xval (_length); _envelope->truncate_end (_length); + cerr << _name << " envelope changd\n"; + + } else if (child->name() == "FadeIn") { _fade_in->clear (); @@ -716,6 +738,7 @@ AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_chan set_fade_in_active (false); } } + cerr << _name << " fadein changd\n"; } else if (child->name() == "FadeOut") { @@ -737,14 +760,24 @@ AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_chan set_fade_out_active (false); } } + cerr << _name << " fadeout changd\n"; } +#endif } + _envelope->thaw (); + thaw (""); + if (send) { + cerr << _name << ": audio final change: " << hex << what_changed << dec << endl; send_change (what_changed); } + if (the_playlist) { + the_playlist->thaw (); + } + return 0; } @@ -836,8 +869,6 @@ AudioRegion::set_fade_in (FadeShape shape, nframes_t len) } _fade_in->thaw (); - - send_change (FadeInChanged); } void @@ -903,8 +934,6 @@ AudioRegion::set_fade_out (FadeShape shape, nframes_t len) } _fade_out->thaw (); - - send_change (FadeOutChanged); } void @@ -1175,7 +1204,7 @@ AudioRegion::set_scale_amplitude (gain_t g) /* tell the diskstream we're in */ if (pl) { - pl->Modified(); + pl->ContentsChanged(); } /* tell everybody else */ @@ -1245,7 +1274,7 @@ AudioRegion::normalize_to (float target_dB) boost::shared_ptr pl (playlist()); if (pl) { - pl->Modified(); + pl->ContentsChanged(); } /* tell everybody else */ diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc index 3ecf3f0172..479674aee6 100644 --- a/libs/ardour/automation_list.cc +++ b/libs/ardour/automation_list.cc @@ -219,6 +219,7 @@ AutomationList::thaw () ControlList::thaw(); if (_changed_when_thawed) { + _changed_when_thawed = false; StateChanged(); /* EMIT SIGNAL */ } } diff --git a/libs/ardour/crossfade.cc b/libs/ardour/crossfade.cc index 75f2bae587..fd59982f62 100644 --- a/libs/ardour/crossfade.cc +++ b/libs/ardour/crossfade.cc @@ -72,7 +72,7 @@ Crossfade::Crossfade (boost::shared_ptr in, boost::shared_ptr