From aafb2c89041d13d4257ba69c969fb8befc382472 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 2 Mar 2025 01:23:12 +0100 Subject: [PATCH] Overhaul [get]last_capture API * Fix copy/edit bug: `get_last_capture_sources` cleared last capture sources. tagging a take made its removal impossible. * `remove_last_capture` also directly modified capture sources by reference in calling thread. * get_ prefix violates styleguide #12 --- libs/ardour/ardour/session.h | 4 ++- libs/ardour/session.cc | 49 ++++++++++++++++++++---------------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index bc66684dae..4c3d178ce4 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -874,7 +874,9 @@ public: int destroy_sources (std::list > const&); int remove_last_capture (); - void get_last_capture_sources (std::list >&); + void get_last_capture_sources (std::list >&); // deprecated + bool have_last_capture_sources () const; + void last_capture_sources (std::list >&) const; void reset_last_capture_sources (); /** handlers should return -1 for "stop cleanup", diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index e537136271..61383ba71a 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -4809,27 +4809,15 @@ Session::destroy_sources (list > const& srcs) int Session::remove_last_capture () { - list > srcs; - - std::shared_ptr rl = routes.reader (); - for (auto const& i : *rl) { - std::shared_ptr tr = std::dynamic_pointer_cast (i); - if (!tr) { - continue; - } - - list >& l = tr->last_capture_sources(); - - if (!l.empty()) { - srcs.insert (srcs.end(), l.begin(), l.end()); - l.clear (); - } - } + list> srcs; + last_capture_sources (srcs); destroy_sources (srcs); /* save state so we don't end up with a session file * referring to non-existent sources. + * + * Note: save_state calls reset_last_capture_sources (); */ save_state (); @@ -4838,7 +4826,7 @@ Session::remove_last_capture () } void -Session::get_last_capture_sources (std::list >& srcs) +Session::last_capture_sources (std::list>& srcs) const { std::shared_ptr rl = routes.reader (); for (auto const& i : *rl) { @@ -4847,13 +4835,32 @@ Session::get_last_capture_sources (std::list >& srcs) continue; } - list >& l = tr->last_capture_sources(); + list> const& l = tr->last_capture_sources(); + srcs.insert (srcs.end(), l.begin(), l.end()); + } +} - if (!l.empty()) { - srcs.insert (srcs.end(), l.begin(), l.end()); - l.clear (); +bool +Session::have_last_capture_sources () const +{ + std::shared_ptr rl = routes.reader (); + for (auto const& i : *rl) { + std::shared_ptr tr = std::dynamic_pointer_cast (i); + if (!tr) { + continue; + } + + if (!tr->last_capture_sources().empty ()) { + return true; } } + return false; +} + +void +Session::get_last_capture_sources (std::list>& srcs) +{ + last_capture_sources (srcs); } void