API development for time domain flipping
This commit is contained in:
parent
1cd1430975
commit
d513653912
@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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 ();
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user