From 4b10beec08c9c1d5ba6fd9cdb8c95ff019b00f65 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 20 Feb 2020 00:25:25 -0700 Subject: change transport API, session API, transportFSM API to move reverse management and motion state (partially) into TFSM --- libs/ardour/ardour/session.h | 6 ++++-- libs/ardour/ardour/transport_api.h | 2 ++ libs/ardour/ardour/transport_fsm.h | 44 +++++++++++++++++++++++++++++++------- 3 files changed, 42 insertions(+), 10 deletions(-) (limited to 'libs/ardour/ardour') diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 9170c0253c..6ab67fbd25 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -771,7 +771,8 @@ public: bool transport_stopped() const; bool transport_stopped_or_stopping() const; bool transport_rolling() const; - + bool transport_will_roll_forwards() const; + bool silent () { return _silent; } TempoMap& tempo_map() { return *_tempo_map; } @@ -1254,6 +1255,8 @@ protected: void schedule_butler_for_transport_work (); bool should_roll_after_locate () const; double speed() const { return _transport_speed; } + samplepos_t position() const { return _transport_sample; } + void set_transport_speed (double speed, bool abort, bool clear_state, bool as_default); private: int create (const std::string& mix_template, BusProfile const *); @@ -1692,7 +1695,6 @@ private: int micro_locate (samplecnt_t distance); void force_locate (samplepos_t sample, LocateTransportDisposition); - void set_transport_speed (double speed, bool abort = false, bool clear_state = false, bool as_default = false); void realtime_stop (bool abort, bool clear_state); void realtime_locate (bool); void non_realtime_start_scrub (); diff --git a/libs/ardour/ardour/transport_api.h b/libs/ardour/ardour/transport_api.h index d7fcc7dea9..5f6d674e3f 100644 --- a/libs/ardour/ardour/transport_api.h +++ b/libs/ardour/ardour/transport_api.h @@ -41,6 +41,8 @@ class LIBARDOUR_API TransportAPI virtual void schedule_butler_for_transport_work () = 0; virtual bool should_roll_after_locate () const = 0; virtual double speed() const = 0; + virtual void set_transport_speed (double speed, bool abort_capture, bool clear_state, bool as_default) = 0; + virtual samplepos_t position() const = 0; }; } /* end namespace ARDOUR */ diff --git a/libs/ardour/ardour/transport_fsm.h b/libs/ardour/ardour/transport_fsm.h index f13a012447..dce30cb665 100644 --- a/libs/ardour/ardour/transport_fsm.h +++ b/libs/ardour/ardour/transport_fsm.h @@ -39,13 +39,14 @@ struct TransportFSM StartTransport, StopTransport, Locate, - LocateDone + LocateDone, + SetSpeed, }; struct Event : public boost::intrusive::list_base_hook<> { EventType type; - /* for stop */ - bool abort; + /* for stop and speed */ + bool abort_capture; bool clear_state; /* for locate */ LocateTransportDisposition ltd; @@ -53,10 +54,13 @@ struct TransportFSM samplepos_t target; bool for_loop_end; bool force; + /* for SetSpeed */ + double speed; + bool as_default; Event (EventType t) : type (t) - , abort (false) + , abort_capture (false) , clear_state (false) , ltd (MustStop) , with_flush (false) @@ -69,7 +73,7 @@ struct TransportFSM } Event (EventType t, bool ab, bool cl) : type (t) - , abort (ab) + , abort_capture (ab) , clear_state (cl) , ltd (MustStop) , with_flush (false) @@ -81,7 +85,7 @@ struct TransportFSM } Event (EventType t, samplepos_t pos, LocateTransportDisposition l, bool fl, bool lp, bool f4c) : type (t) - , abort (false) + , abort_capture (false) , clear_state (false) , ltd (l) , with_flush (fl) @@ -91,6 +95,15 @@ struct TransportFSM { assert (t == Locate); } + Event (EventType t, double sp, bool ab, bool cs, bool ad) + : type (t) + , abort_capture (ab) + , clear_state (cs) + , speed (sp) + , as_default (ad) + { + assert (t == SetSpeed); + } void* operator new (size_t); void operator delete (void *ptr, size_t /*size*/); @@ -128,11 +141,18 @@ struct TransportFSM WaitingForButler }; + enum DirectionState { + Forwards, + Backwards, + Reversing, + }; + std::string current_state () const; private: MotionState _motion_state; ButlerState _butler_state; + DirectionState _direction_state; void init(); @@ -147,6 +167,7 @@ struct TransportFSM void start_locate_while_stopped (Event const &) const; void interrupt_locate (Event const &) const; void start_declick_for_locate (Event const &); + void set_speed (Event const &); /* guards */ @@ -161,18 +182,23 @@ struct TransportFSM bool waiting_for_butler() const { return _butler_state == WaitingForButler; } bool declick_in_progress() const { return _motion_state == DeclickToLocate || _motion_state == DeclickToStop; } bool declicking_for_locate() const { return _motion_state == DeclickToLocate; } + bool forwards() const { return _direction_state == Forwards; } + bool backwards() const { return _direction_state == Backwards; } + bool will_roll_fowards() const; void enqueue (Event* ev); private: - void transition (MotionState ms); - void transition (ButlerState bs); + void transition (MotionState); + void transition (ButlerState); + void transition (DirectionState); void process_events (); bool process_event (Event&, bool was_deferred, bool& deferred); Event _last_locate; + Event last_speed_request; TransportAPI* api; typedef boost::intrusive::list EventList; @@ -180,6 +206,8 @@ struct TransportFSM EventList deferred_events; int processing; mutable boost::optional current_roll_after_locate_status; + double most_recently_requested_speed; + bool _reversing; void defer (Event& ev); void bad_transition (Event const &); -- cgit v1.2.3