summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/ardour')
-rw-r--r--libs/ardour/ardour/session.h6
-rw-r--r--libs/ardour/ardour/transport_api.h2
-rw-r--r--libs/ardour/ardour/transport_fsm.h44
3 files changed, 42 insertions, 10 deletions
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<Event> EventList;
@@ -180,6 +206,8 @@ struct TransportFSM
EventList deferred_events;
int processing;
mutable boost::optional<bool> current_roll_after_locate_status;
+ double most_recently_requested_speed;
+ bool _reversing;
void defer (Event& ev);
void bad_transition (Event const &);