From 08559abc106283cd8c57a8dfc9dd3b6aa79fdcac Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 27 Feb 2020 22:16:12 +0100 Subject: Add signals to indicate Punch/Loop constraints This is in preparation for GUI sensitivity of Loop and Punch actions. --- libs/ardour/ardour/session.h | 8 +++++--- libs/ardour/session.cc | 16 ++++++++++++++++ libs/ardour/session_transport.cc | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 221a5ab6cc..1ed5413206 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -775,6 +775,10 @@ public: bool silent () { return _silent; } + bool punch_is_possible () const; + bool loop_is_possible () const; + PBD::Signal0 PunchLoopConstraintChange; + TempoMap& tempo_map() { return *_tempo_map; } const TempoMap& tempo_map() const { return *_tempo_map; } void maybe_update_tempo_from_midiclock_tempo (float bpm); @@ -1702,11 +1706,9 @@ private: volatile guint _punch_or_loop; // enum PunchLoopLock - bool punch_is_possible () const; - bool loop_is_possible () const; - bool punch_active () const; void unset_punch (); + void reset_punch_loop_constraint (); bool maybe_allow_only_loop (bool play_loop = false); bool maybe_allow_only_punch (); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index a2c61c8bb8..74c0fbb22e 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -1428,12 +1428,25 @@ Session::loop_is_possible () const return g_atomic_int_get(&_punch_or_loop) != OnlyPunch; } +void +Session::reset_punch_loop_constraint () +{ + if (g_atomic_int_get (&_punch_or_loop) == NoConstraint) { + return; + } + g_atomic_int_set (&_punch_or_loop, NoConstraint); + PunchLoopConstraintChange (); /* EMIT SIGNAL */ +} + bool Session::maybe_allow_only_loop (bool play_loop) { if (!(get_play_loop () || play_loop)) { return false; } bool rv = g_atomic_int_compare_and_exchange (&_punch_or_loop, NoConstraint, OnlyLoop); + if (rv) { + PunchLoopConstraintChange (); /* EMIT SIGNAL */ + } if (rv || loop_is_possible ()) { unset_punch (); return true; @@ -1447,6 +1460,9 @@ Session::maybe_allow_only_punch () { return false; } bool rv = g_atomic_int_compare_and_exchange (&_punch_or_loop, NoConstraint, OnlyPunch); + if (rv) { + PunchLoopConstraintChange (); /* EMIT SIGNAL */ + } return rv || punch_is_possible (); } diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index a79e39a4c2..2159a61a36 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -145,7 +145,7 @@ Session::realtime_stop (bool abort, bool clear_state) reset_slave_state (); - g_atomic_int_set (&_punch_or_loop, NoConstraint); + reset_punch_loop_constraint (); _transport_speed = 0; _target_transport_speed = 0; -- cgit v1.2.3