13
0

API development for time domain flipping

This commit is contained in:
Paul Davis 2023-02-23 23:00:57 -07:00
parent 1cd1430975
commit d513653912
5 changed files with 73 additions and 4 deletions

View File

@ -1386,6 +1386,8 @@ public:
bool bang_trigger_at(int32_t route_index, int32_t row_index);
bool unbang_trigger_at(int32_t route_index, int32_t row_index);
void globally_change_time_domain (Temporal::TimeDomain from, Temporal::TimeDomain to);
protected:
friend class AudioEngine;
void set_block_size (pframes_t nframes);
@ -2374,8 +2376,6 @@ private:
int tb_with_filled_slots;
void handle_slots_empty_status (std::weak_ptr<Route> const &);
void globally_change_time_domain (Temporal::TimeDomain from, Temporal::TimeDomain to);
};

View File

@ -213,7 +213,6 @@ Butler::thread_work ()
Temporal::TempoMap::fetch ();
restart:
/* Ensure that no reads migrate before this fence */
std::atomic_thread_fence (std::memory_order_acquire);
DEBUG_TRACE (DEBUG::Butler, "at restart for disk work\n");

View File

@ -766,6 +766,16 @@ Location::set_scene_change (std::shared_ptr<SceneChange> sc)
void
Location::globally_change_time_domain (Temporal::TimeDomain from, Temporal::TimeDomain to)
{
assert (domain_swap);
if (_start.time_domain() == from) {
_start.set_time_domain (to);
_end.set_time_domain (to);
domain_swap->add (_start);
domain_swap->add (_end);
}
}
/*---------------------------------------------------------------------- */
@ -1727,7 +1737,7 @@ Locations::globally_change_time_domain (Temporal::TimeDomain from, Temporal::Tim
{
Glib::Threads::RWLock::WriterLock lm (_lock);
for (auto & l : locations) {
globally_change_time_domain (from, to);
l->globally_change_time_domain (from, to);
}
}

View File

@ -4128,3 +4128,41 @@ TempoCommand::operator() ()
map->set_state (*_after, Stateful::current_state_version);
TempoMap::update (map);
}
DomainSwapInformation* Temporal::domain_swap (0);
DomainSwapInformation*
DomainSwapInformation::start(TimeDomain prev)
{
assert (!domain_swap);
domain_swap = new DomainSwapInformation (prev);
return domain_swap;
}
DomainSwapInformation::~DomainSwapInformation ()
{
assert (this == domain_swap);
undo ();
domain_swap = 0;
}
void
DomainSwapInformation::clear ()
{
counts.clear ();
positions.clear ();
}
void
DomainSwapInformation::undo ()
{
for (auto & c : counts) {
c->set_time_domain (previous);
}
for (auto & p : positions) {
p->set_time_domain (previous);
}
clear ();
}

View File

@ -1141,6 +1141,28 @@ class LIBTEMPORAL_API TempoCommand : public Command {
XMLNode const * _after;
};
class DomainSwapInformation {
public:
static DomainSwapInformation* start (TimeDomain prev);
~DomainSwapInformation ();
void add (timecnt_t& t) { counts.push_back (&t); }
void add (timepos_t& p) { positions.push_back (&p); }
void clear ();
private:
DomainSwapInformation (TimeDomain prev) : previous (prev) {}
std::vector<timecnt_t*> counts;
std::vector<timepos_t*> positions;
TimeDomain previous;
void undo ();
};
extern DomainSwapInformation* domain_swap;
} /* end of namespace Temporal */
#ifdef COMPILER_MSVC