Consolidate RegionsPropertyChanged signal emission (1/3)

This prepares to combine multiple RegionPropertyChanged signals
(potentially thousands) into a single signal.
This commit is contained in:
Robin Gareus 2021-05-07 20:53:29 +02:00
parent 5af480083c
commit 2ff8f5a5de
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
5 changed files with 57 additions and 8 deletions

View File

@ -101,6 +101,10 @@ public:
static PBD::Signal2<void,boost::shared_ptr<ARDOUR::Region>, const PBD::PropertyChange&> RegionPropertyChanged;
static PBD::Signal2<void,boost::shared_ptr<RegionList>, const PBD::PropertyChange&> RegionsPropertyChanged;
typedef std::map <PBD::PropertyChange, RegionList> ChangeMap;
virtual ~Region();
/** Note: changing the name of a Region does not constitute an edit */
@ -366,6 +370,11 @@ public:
void drop_sources ();
/* Allow to collect RegionsPropertyChanged signal emissions */
void set_changemap (ChangeMap* changemap) {
_changemap = changemap;
}
protected:
virtual XMLNode& state ();
@ -478,6 +487,8 @@ private:
mutable RegionEditState _first_edit;
layer_t _layer;
ChangeMap* _changemap;
void register_properties ();
void use_sources (SourceList const &);

View File

@ -620,11 +620,16 @@ Playlist::flush_notifications (bool from_undo)
crossfade_ranges.push_back ((*r)->range ());
}
boost::shared_ptr<RegionList> rl (new RegionList);
for (s = pending_removes.begin (); s != pending_removes.end (); ++s) {
crossfade_ranges.push_back ((*s)->range ());
remove_dependents (*s);
RegionRemoved (boost::weak_ptr<Region> (*s)); /* EMIT SIGNAL */
Region::RegionPropertyChanged (*s, Properties::hidden);
rl->push_back (*s);
Region::RegionPropertyChanged (*s, Properties::hidden); // XXX remove me
}
if (rl->size () > 0) {
Region::RegionsPropertyChanged (rl, Properties::hidden);
}
for (s = pending_adds.begin (); s != pending_adds.end (); ++s) {

View File

@ -87,6 +87,7 @@ namespace ARDOUR {
}
PBD::Signal2<void,boost::shared_ptr<ARDOUR::Region>,const PropertyChange&> Region::RegionPropertyChanged;
PBD::Signal2<void,boost::shared_ptr<ARDOUR::RegionList>,const PropertyChange&> Region::RegionsPropertyChanged;
void
Region::make_property_quarks ()
@ -262,6 +263,7 @@ Region::Region (Session& s, samplepos_t start, samplecnt_t length, const string&
, _last_position (0)
, _first_edit (EditChangesNothing)
, _layer (0)
, _changemap (0)
{
register_properties ();
@ -277,6 +279,7 @@ Region::Region (const SourceList& srcs)
, _last_position (0)
, _first_edit (EditChangesNothing)
, _layer (0)
, _changemap (0)
{
register_properties ();
@ -297,6 +300,7 @@ Region::Region (boost::shared_ptr<const Region> other)
, _last_position(other->_last_position) \
, _first_edit (EditChangesNothing)
, _layer (other->_layer)
, _changemap (other->_changemap)
{
register_properties ();
@ -359,6 +363,7 @@ Region::Region (boost::shared_ptr<const Region> other, MusicSample offset)
, _last_position(other->_last_position) \
, _first_edit (EditChangesNothing)
, _layer (other->_layer)
, _changemap (other->_changemap)
{
register_properties ();
@ -415,6 +420,7 @@ Region::Region (boost::shared_ptr<const Region> other, const SourceList& srcs)
, _last_position (other->_last_position)
, _first_edit (EditChangesID)
, _layer (other->_layer)
, _changemap (other->_changemap)
{
register_properties ();
@ -1490,12 +1496,20 @@ Region::send_change (const PropertyChange& what_changed)
if (!Stateful::property_changes_suspended()) {
/* Try and send a shared_pointer unless this is part of the constructor.
If so, do nothing.
*/
* If so, do nothing.
*/
try {
boost::shared_ptr<Region> rptr = shared_from_this();
RegionPropertyChanged (rptr, what_changed);
if (_changemap) {
(*_changemap)[what_changed].push_back (rptr);
} else {
boost::shared_ptr<RegionList> rl (new RegionList);
rl->push_back (rptr);
RegionsPropertyChanged (rl, what_changed);
RegionPropertyChanged (rptr, what_changed); // XXX remove me
}
} catch (...) {
/* no shared_ptr available, relax; */
}

View File

@ -42,8 +42,16 @@ ThawList::add (boost::shared_ptr<Region> r)
void
ThawList::release ()
{
Region::ChangeMap cm;
for (RegionList::iterator i = begin (); i != end (); ++i) {
(*i)->set_changemap (&cm);
(*i)->resume_property_changes ();
(*i)->set_changemap (0);
}
for (Region::ChangeMap::const_iterator i = cm.begin (); i != cm.end (); ++i) {
boost::shared_ptr<RegionList> rl (new RegionList (i->second));
assert (rl->size () > 0);
Region::RegionsPropertyChanged (rl, i->first);
}
clear ();
}

View File

@ -662,7 +662,7 @@ Track::find_and_use_playlist (DataType dt, PBD::ID const & id)
void
update_region_visibility(boost::shared_ptr<Region> r)
{
Region::RegionPropertyChanged(r, Properties::hidden);
Region::RegionPropertyChanged(r, Properties::hidden); // XXX remove me
}
@ -683,9 +683,20 @@ Track::use_playlist (DataType dt, boost::shared_ptr<Playlist> p)
_playlists[dt] = p;
}
//allow all regions of prior and new playlists to update their visibility?
if (old) old->foreach_region(update_region_visibility);
if (p) p->foreach_region(update_region_visibility);
if (old) {
boost::shared_ptr<RegionList> rl (new RegionList (old->region_list_property ().rlist ()));
if (rl->size () > 0) {
Region::RegionsPropertyChanged (rl, Properties::hidden);
}
old->foreach_region(update_region_visibility); // XXX remove me
}
if (p) {
boost::shared_ptr<RegionList> rl (new RegionList (p->region_list_property ().rlist ()));
if (rl->size () > 0) {
Region::RegionsPropertyChanged (rl, Properties::hidden);
}
p->foreach_region(update_region_visibility); // XXX remove me
}
_session.set_dirty ();
PlaylistChanged (); /* EMIT SIGNAL */