add new template methods for "foreach {route,track}" and use them
Also remove redundant double call to Track::set_block_size(). This dates back to 2010 when there used be an additional traversal of the Diskstream RCU-managed list, before they became owned by Tracks
This commit is contained in:
parent
95d9f60035
commit
490fac1632
|
@ -350,6 +350,12 @@ public:
|
|||
template<class T> void foreach_route (T *obj, void (T::*func)(boost::shared_ptr<Route>), bool sort = true);
|
||||
template<class T, class A> void foreach_route (T *obj, void (T::*func)(Route&, A), A arg, bool sort = true);
|
||||
|
||||
template<class A> void foreach_track (void (Track::*method)(A), A arg);
|
||||
template<class A1, class A2> void foreach_track (void (Track::*method)(A1, A2), A1 arg1, A2 arg2);
|
||||
|
||||
template<class A> void foreach_route (void (Route::*method)(A), A arg);
|
||||
template<class A1, class A2> void foreach_route (void (Route::*method)(A1, A2), A1 arg1, A2 arg2);
|
||||
|
||||
static char session_name_is_legal (const std::string&);
|
||||
bool io_name_is_legal (const std::string&) const;
|
||||
boost::shared_ptr<Route> route_by_name (std::string) const;
|
||||
|
|
|
@ -76,6 +76,53 @@ Session::foreach_route (T *obj, void (T::*func)(Route&, A), A arg1, bool sort)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
template<class A> void
|
||||
Session::foreach_track (void (Track::*method)(A), A arg)
|
||||
{
|
||||
boost::shared_ptr<RouteList> r = routes.reader();
|
||||
|
||||
for (RouteList::iterator i = r->begin(); i != r->end(); i++) {
|
||||
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
|
||||
if (tr) {
|
||||
(tr->*method) (arg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<class A1, class A2> void
|
||||
Session::foreach_track (void (Track::*method)(A1, A2), A1 arg1, A2 arg2)
|
||||
{
|
||||
boost::shared_ptr<RouteList> r = routes.reader();
|
||||
|
||||
for (RouteList::iterator i = r->begin(); i != r->end(); i++) {
|
||||
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
|
||||
if (tr) {
|
||||
(tr->*method) (arg1, arg2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<class A> void
|
||||
Session::foreach_route (void (Route::*method)(A), A arg)
|
||||
{
|
||||
boost::shared_ptr<RouteList> r = routes.reader();
|
||||
|
||||
for (RouteList::iterator i = r->begin(); i != r->end(); i++) {
|
||||
((*i).get()->*method) (arg);
|
||||
}
|
||||
}
|
||||
|
||||
template<class A1, class A2> void
|
||||
Session::foreach_route (void (Route::*method)(A1, A2), A1 arg1, A2 arg2)
|
||||
{
|
||||
boost::shared_ptr<RouteList> r = routes.reader();
|
||||
|
||||
for (RouteList::iterator i = r->begin(); i != r->end(); i++) {
|
||||
((*i).get()->*method) (arg1, arg2);
|
||||
}
|
||||
}
|
||||
|
||||
} /* namespace */
|
||||
|
||||
#endif /* __ardour_session_route_h__ */
|
||||
|
|
|
@ -109,6 +109,7 @@
|
|||
#include "ardour/session.h"
|
||||
#include "ardour/session_directory.h"
|
||||
#include "ardour/session_playlists.h"
|
||||
#include "ardour/session_route.h"
|
||||
#include "ardour/smf_source.h"
|
||||
#include "ardour/solo_isolate_control.h"
|
||||
#include "ardour/source_factory.h"
|
||||
|
@ -2080,19 +2081,7 @@ Session::set_block_size (pframes_t nframes)
|
|||
|
||||
ensure_buffers ();
|
||||
|
||||
boost::shared_ptr<RouteList> r = routes.reader ();
|
||||
|
||||
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
|
||||
(*i)->set_block_size (nframes);
|
||||
}
|
||||
|
||||
boost::shared_ptr<RouteList> rl = routes.reader ();
|
||||
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
|
||||
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
|
||||
if (tr) {
|
||||
tr->set_block_size (nframes);
|
||||
}
|
||||
}
|
||||
foreach_route (&Route::set_block_size, nframes);
|
||||
|
||||
DEBUG_TRACE (DEBUG::LatencyCompensation, "Session::set_block_size -> update worst i/o latency\n");
|
||||
/* when this is called from the auto-connect thread, the process-lock is held */
|
||||
|
|
|
@ -107,13 +107,7 @@ Session::overwrite_some_buffers (boost::shared_ptr<Route> r, OverwriteReason why
|
|||
|
||||
} else {
|
||||
|
||||
boost::shared_ptr<RouteList> rl = routes.reader();
|
||||
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
|
||||
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
|
||||
if (tr) {
|
||||
tr->set_pending_overwrite (why);
|
||||
}
|
||||
}
|
||||
foreach_track (&Track::set_pending_overwrite, why);
|
||||
}
|
||||
|
||||
add_post_transport_work (PostTransportOverWrite);
|
||||
|
|
Loading…
Reference in New Issue