Temporarily revert ongoing varispeed development
This revertsbf88f3fe64until35813db0f4in order to move development into a branch, until after the upcoming 6.8 release
This commit is contained in:
@@ -174,6 +174,7 @@ CONFIG_VARIABLE (samplecnt_t, preroll, "preroll", 0)
|
||||
CONFIG_VARIABLE (samplecnt_t, postroll, "postroll", 0)
|
||||
CONFIG_VARIABLE (float, shuttle_speed_factor, "shuttle-speed-factor", 1.0f) // used for MMC shuttle
|
||||
CONFIG_VARIABLE (float, shuttle_speed_threshold, "shuttle-speed-threshold", 5.0f) // used for MMC shuttle
|
||||
CONFIG_VARIABLE (ShuttleBehaviour, shuttle_behaviour, "shuttle-behaviour", Wheel)
|
||||
CONFIG_VARIABLE (ShuttleUnits, shuttle_units, "shuttle-units", Percentage)
|
||||
CONFIG_VARIABLE (float, shuttle_max_speed, "shuttle-max-speed", 8.0f)
|
||||
CONFIG_VARIABLE (bool, locate_while_waiting_for_sync, "locate-while-waiting-for-sync", false)
|
||||
|
||||
@@ -479,12 +479,9 @@ public:
|
||||
void use_rf_shuttle_speed ();
|
||||
void allow_auto_play (bool yn);
|
||||
|
||||
double default_play_speed ();
|
||||
void set_default_play_speed (double spd, TransportRequestSource origin = TRS_UI);
|
||||
void reset_transport_speed (TransportRequestSource origin = TRS_UI);
|
||||
|
||||
void request_transport_speed (double speed, TransportRequestSource origin = TRS_UI);
|
||||
void request_transport_speed_nonzero (double, TransportRequestSource origin = TRS_UI);
|
||||
void request_transport_speed (double speed, bool as_default = true, TransportRequestSource origin = TRS_UI);
|
||||
void request_transport_speed_nonzero (double, bool as_default = true, TransportRequestSource origin = TRS_UI);
|
||||
void request_overwrite_buffer (boost::shared_ptr<Track>, OverwriteReason);
|
||||
void adjust_playback_buffering();
|
||||
void adjust_capture_buffering();
|
||||
@@ -1393,6 +1390,10 @@ private:
|
||||
|
||||
// varispeed playback -- TODO: move out of session to backend.
|
||||
double _engine_speed;
|
||||
double _default_transport_speed;
|
||||
double _default_engine_speed;
|
||||
double _last_transport_speed;
|
||||
double _requested_transport_speed;
|
||||
double _signalled_varispeed;
|
||||
|
||||
bool auto_play_legal;
|
||||
|
||||
@@ -54,6 +54,7 @@ struct TransportFSM
|
||||
bool force;
|
||||
/* for SetSpeed */
|
||||
double speed;
|
||||
bool as_default;
|
||||
|
||||
Event (EventType t)
|
||||
: type (t)
|
||||
@@ -94,9 +95,10 @@ struct TransportFSM
|
||||
cast double-to-bool and complains. C++11 would allow "=
|
||||
delete" as an alternate fix, but this is fine.
|
||||
*/
|
||||
Event (double sp)
|
||||
Event (double sp, bool ad)
|
||||
: type (SetSpeed)
|
||||
, speed (sp)
|
||||
, as_default (ad)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -145,9 +147,7 @@ struct TransportFSM
|
||||
std::string current_state () const;
|
||||
|
||||
double transport_speed() const { return _transport_speed; }
|
||||
|
||||
double default_speed() const { return _default_speed; }
|
||||
void set_default_speed(double spd) const { _default_speed = spd; }
|
||||
|
||||
private:
|
||||
MotionState _motion_state;
|
||||
|
||||
@@ -626,6 +626,11 @@ enum TransportRequestType {
|
||||
TR_Locate = 0x4
|
||||
};
|
||||
|
||||
enum ShuttleBehaviour {
|
||||
Sprung,
|
||||
Wheel
|
||||
};
|
||||
|
||||
enum ShuttleUnits {
|
||||
Percentage,
|
||||
Semitones
|
||||
|
||||
@@ -48,6 +48,7 @@ DEFINE_ENUM_CONVERT(ARDOUR::ListenPosition)
|
||||
DEFINE_ENUM_CONVERT(ARDOUR::LayerModel)
|
||||
DEFINE_ENUM_CONVERT(ARDOUR::InsertMergePolicy)
|
||||
DEFINE_ENUM_CONVERT(ARDOUR::SyncSource)
|
||||
DEFINE_ENUM_CONVERT(ARDOUR::ShuttleBehaviour)
|
||||
DEFINE_ENUM_CONVERT(ARDOUR::ShuttleUnits)
|
||||
DEFINE_ENUM_CONVERT(ARDOUR::ClockDeltaMode)
|
||||
DEFINE_ENUM_CONVERT(ARDOUR::DenormalModel)
|
||||
|
||||
@@ -99,6 +99,7 @@ setup_enum_writer ()
|
||||
PluginType _PluginType;
|
||||
SyncSource _SyncSource;
|
||||
TransportRequestType _TransportRequestType;
|
||||
ShuttleBehaviour _ShuttleBehaviour;
|
||||
ShuttleUnits _ShuttleUnits;
|
||||
Session::RecordState _Session_RecordState;
|
||||
SessionEvent::Type _SessionEvent_Type;
|
||||
@@ -433,6 +434,10 @@ setup_enum_writer ()
|
||||
REGISTER_ENUM (TR_Locate);
|
||||
REGISTER (_TransportRequestType);
|
||||
|
||||
REGISTER_ENUM (Sprung);
|
||||
REGISTER_ENUM (Wheel);
|
||||
REGISTER (_ShuttleBehaviour);
|
||||
|
||||
REGISTER_ENUM (Percentage);
|
||||
REGISTER_ENUM (Semitones);
|
||||
REGISTER (_ShuttleUnits);
|
||||
|
||||
@@ -2274,6 +2274,11 @@ LuaBindings::common (lua_State* L)
|
||||
.addConst ("ForceSel", ARDOUR::RangeSelectionAfterSplit(ForceSel))
|
||||
.endNamespace ()
|
||||
|
||||
.beginNamespace ("ShuttleBehaviour")
|
||||
.addConst ("Sprung", ARDOUR::ShuttleBehaviour(Sprung))
|
||||
.addConst ("Wheel", ARDOUR::ShuttleBehaviour(Wheel))
|
||||
.endNamespace ()
|
||||
|
||||
.beginNamespace ("ScreenSaverMode")
|
||||
.addConst ("InhibitNever", ARDOUR::ScreenSaverMode(InhibitNever))
|
||||
.addConst ("InhibitWhileRecording", ARDOUR::ScreenSaverMode(InhibitWhileRecording))
|
||||
|
||||
@@ -191,6 +191,8 @@ Session::Session (AudioEngine &eng,
|
||||
, _silent (false)
|
||||
, _remaining_latency_preroll (0)
|
||||
, _engine_speed (1.0)
|
||||
, _last_transport_speed (1.0)
|
||||
, _requested_transport_speed (std::numeric_limits<double>::max())
|
||||
, _signalled_varispeed (0)
|
||||
, auto_play_legal (false)
|
||||
, _requested_return_sample (-1)
|
||||
|
||||
@@ -43,7 +43,7 @@ using namespace ARDOUR;
|
||||
using namespace PBD;
|
||||
|
||||
#define TFSM_ROLL() { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::StartTransport)); }
|
||||
#define TFSM_SPEED(speed) { _transport_fsm->enqueue (new TransportFSM::Event (speed)); }
|
||||
#define TFSM_SPEED(speed,as_default) { _transport_fsm->enqueue (new TransportFSM::Event (speed,as_default)); }
|
||||
|
||||
boost::shared_ptr<ExportHandler>
|
||||
Session::get_export_handler ()
|
||||
@@ -308,7 +308,7 @@ Session::process_export_fw (pframes_t nframes)
|
||||
return;
|
||||
}
|
||||
|
||||
TFSM_SPEED (1.0);
|
||||
TFSM_SPEED (1.0, false);
|
||||
TFSM_ROLL ();
|
||||
_butler->schedule_transport_work ();
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ using namespace std;
|
||||
#define TFSM_EVENT(evtype) { _transport_fsm->enqueue (new TransportFSM::Event (evtype)); }
|
||||
#define TFSM_ROLL() { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::StartTransport)); }
|
||||
#define TFSM_STOP(abort,clear) { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::StopTransport,abort,clear)); }
|
||||
#define TFSM_SPEED(speed) { _transport_fsm->enqueue (new TransportFSM::Event (speed)); }
|
||||
#define TFSM_SPEED(speed,as_default) { _transport_fsm->enqueue (new TransportFSM::Event (speed,as_default)); }
|
||||
#define TFSM_LOCATE(target,ltd,loop,force) { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::Locate,target,ltd,loop,force)); }
|
||||
|
||||
|
||||
@@ -918,7 +918,7 @@ Session::process_event (SessionEvent* ev)
|
||||
|
||||
|
||||
case SessionEvent::SetTransportSpeed:
|
||||
TFSM_SPEED (ev->speed);
|
||||
TFSM_SPEED (ev->speed, ev->yes_or_no);
|
||||
break;
|
||||
|
||||
case SessionEvent::StartRoll:
|
||||
@@ -986,7 +986,7 @@ Session::process_event (SessionEvent* ev)
|
||||
break;
|
||||
|
||||
case SessionEvent::SetPlayAudioRange:
|
||||
set_play_range (ev->audio_range, (ev->speed == _transport_fsm->default_speed())); //an explicit PLAY state would be nicer here
|
||||
set_play_range (ev->audio_range, (ev->speed == 1.0f));
|
||||
break;
|
||||
|
||||
case SessionEvent::CancelPlayAudioRange:
|
||||
@@ -1251,11 +1251,7 @@ Session::plan_master_strategy (pframes_t nframes, double master_speed, samplepos
|
||||
*/
|
||||
|
||||
if (!config.get_external_sync()) {
|
||||
float desired = actual_speed ();
|
||||
if (desired==0.0) {
|
||||
return _transport_fsm->default_speed();
|
||||
}
|
||||
return desired;
|
||||
return actual_speed ();
|
||||
}
|
||||
|
||||
/* When calling TransportMasterStart, sould aim for
|
||||
|
||||
@@ -86,7 +86,7 @@ using namespace PBD;
|
||||
#define TFSM_EVENT(evtype) { _transport_fsm->enqueue (new TransportFSM::Event (evtype)); }
|
||||
#define TFSM_STOP(abort,clear) { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::StopTransport,abort,clear)); }
|
||||
#define TFSM_LOCATE(target,ltd,loop,force) { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::Locate,target,ltd,loop,force)); }
|
||||
#define TFSM_SPEED(speed) { _transport_fsm->enqueue (new TransportFSM::Event (speed)); }
|
||||
#define TFSM_SPEED(speed,as_default) { _transport_fsm->enqueue (new TransportFSM::Event (speed,as_default)); }
|
||||
|
||||
/* *****************************************************************************
|
||||
* REALTIME ACTIONS (to be called on state transitions)
|
||||
@@ -309,23 +309,6 @@ Session::post_locate ()
|
||||
}
|
||||
}
|
||||
|
||||
double
|
||||
Session::default_play_speed ()
|
||||
{
|
||||
return _transport_fsm->default_speed();
|
||||
}
|
||||
|
||||
/** Set the default speed that is used when we respond to a "play" action.
|
||||
* @param speed New speed
|
||||
*/
|
||||
void
|
||||
Session::set_default_play_speed (double spd, TransportRequestSource origin)
|
||||
{
|
||||
_transport_fsm->set_default_speed(spd);
|
||||
TFSM_SPEED(spd);
|
||||
TransportStateChange (); /* EMIT SIGNAL */
|
||||
}
|
||||
|
||||
/** Set the transport speed.
|
||||
* Called from the process thread.
|
||||
* @param speed New speed
|
||||
@@ -336,8 +319,6 @@ Session::set_transport_speed (double speed)
|
||||
ENSURE_PROCESS_THREAD;
|
||||
DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %1 Set transport speed to %2 from %3 (es = %4)\n", _transport_sample, speed, _transport_fsm->transport_speed(), _engine_speed));
|
||||
|
||||
double default_speed = _transport_fsm->default_speed();
|
||||
|
||||
assert (speed != 0.0);
|
||||
|
||||
/* the logic:
|
||||
@@ -354,7 +335,7 @@ Session::set_transport_speed (double speed)
|
||||
|
||||
*/
|
||||
|
||||
if ((_engine_speed != default_speed) && (_engine_speed == fabs (speed)) && ((speed * _transport_fsm->transport_speed()) > 0)) {
|
||||
if ((_engine_speed != 1) && (_engine_speed == fabs (speed)) && ((speed * _transport_fsm->transport_speed()) > 0)) {
|
||||
/* engine speed is not changing and no direction change, do nothing */
|
||||
DEBUG_TRACE (DEBUG::Transport, "no reason to change speed, do nothing\n");
|
||||
return;
|
||||
@@ -384,9 +365,8 @@ Session::set_transport_speed (double speed)
|
||||
clear_clicks ();
|
||||
_engine_speed = new_engine_speed;
|
||||
|
||||
if (!Config->get_auto_return_after_rewind_ffwd() && fabs (speed) > 2.0) {
|
||||
/* fast-wind of any sort should cancel auto-return */
|
||||
/* since we don't have an actual ffwd/rew state yet, just trigger on a 'fast' varispeed */
|
||||
if (!Config->get_auto_return_after_rewind_ffwd() && fabs (speed) != 1.0 && _transport_fsm->default_speed() == 1.0) {
|
||||
/* varispeed of any sort cancels auto-return */
|
||||
_requested_return_sample = -1;
|
||||
_last_roll_location = -1;
|
||||
_last_roll_or_reversal_location = -1;
|
||||
@@ -410,7 +390,7 @@ Session::set_transport_speed (double speed)
|
||||
|
||||
if (fabs (_signalled_varispeed - act_speed) > .002
|
||||
// still, signal hard changes to 1.0 and 0.0:
|
||||
|| (act_speed == default_speed && _signalled_varispeed != default_speed)
|
||||
|| (act_speed == 1.0 && _signalled_varispeed != 1.0)
|
||||
|| (act_speed == 0.0 && _signalled_varispeed != 0.0)
|
||||
)
|
||||
{
|
||||
@@ -762,11 +742,11 @@ Session::request_sync_source (boost::shared_ptr<TransportMaster> tm)
|
||||
void
|
||||
Session::reset_transport_speed (TransportRequestSource origin)
|
||||
{
|
||||
request_transport_speed (_transport_fsm->default_speed(), origin);
|
||||
request_transport_speed (1.0, true, origin);
|
||||
}
|
||||
|
||||
void
|
||||
Session::request_transport_speed (double speed, TransportRequestSource origin)
|
||||
Session::request_transport_speed (double speed, bool as_default, TransportRequestSource origin)
|
||||
{
|
||||
if (synced_to_engine()) {
|
||||
if (speed != 0) {
|
||||
@@ -788,7 +768,8 @@ Session::request_transport_speed (double speed, TransportRequestSource origin)
|
||||
}
|
||||
|
||||
SessionEvent* ev = new SessionEvent (SessionEvent::SetTransportSpeed, SessionEvent::Add, SessionEvent::Immediate, 0, speed);
|
||||
DEBUG_TRACE (DEBUG::Transport, string_compose ("Request transport speed = %1 as default = %2\n", speed));
|
||||
ev->yes_or_no = as_default; // as_default
|
||||
DEBUG_TRACE (DEBUG::Transport, string_compose ("Request transport speed = %1 as default = %2\n", speed, as_default));
|
||||
queue_event (ev);
|
||||
}
|
||||
|
||||
@@ -797,13 +778,13 @@ Session::request_transport_speed (double speed, TransportRequestSource origin)
|
||||
* be used by callers who are varying transport speed but don't ever want to stop it.
|
||||
*/
|
||||
void
|
||||
Session::request_transport_speed_nonzero (double speed, TransportRequestSource origin)
|
||||
Session::request_transport_speed_nonzero (double speed, bool as_default, TransportRequestSource origin)
|
||||
{
|
||||
if (speed == 0) {
|
||||
speed = DBL_EPSILON;
|
||||
}
|
||||
|
||||
request_transport_speed (speed);
|
||||
request_transport_speed (speed, as_default);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -925,7 +906,7 @@ Session::request_count_in_record ()
|
||||
}
|
||||
maybe_enable_record ();
|
||||
_count_in_once = true;
|
||||
request_transport_speed(_transport_fsm->default_speed());
|
||||
request_transport_speed (1.0, true);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -955,7 +936,7 @@ Session::request_play_loop (bool yn, bool change_transport_roll)
|
||||
/* currently stopped */
|
||||
if (yn) {
|
||||
/* start looping at normal speed */
|
||||
target_speed = _transport_fsm->default_speed();
|
||||
target_speed = 1.0;
|
||||
} else {
|
||||
target_speed = 0.0;
|
||||
}
|
||||
@@ -973,7 +954,7 @@ Session::request_play_loop (bool yn, bool change_transport_roll)
|
||||
void
|
||||
Session::request_play_range (list<AudioRange>* range, bool leave_rolling)
|
||||
{
|
||||
SessionEvent* ev = new SessionEvent (SessionEvent::SetPlayAudioRange, SessionEvent::Add, SessionEvent::Immediate, 0, (leave_rolling ? _transport_fsm->default_speed() : 0.0));
|
||||
SessionEvent* ev = new SessionEvent (SessionEvent::SetPlayAudioRange, SessionEvent::Add, SessionEvent::Immediate, 0, (leave_rolling ? 1.0 : 0.0));
|
||||
if (range) {
|
||||
ev->audio_range = *range;
|
||||
} else {
|
||||
@@ -1754,7 +1735,7 @@ Session::set_requested_return_sample (samplepos_t return_to)
|
||||
void
|
||||
Session::request_roll_at_and_return (samplepos_t start, samplepos_t return_to)
|
||||
{
|
||||
SessionEvent *ev = new SessionEvent (SessionEvent::LocateRollLocate, SessionEvent::Add, SessionEvent::Immediate, return_to, _transport_fsm->default_speed());
|
||||
SessionEvent *ev = new SessionEvent (SessionEvent::LocateRollLocate, SessionEvent::Add, SessionEvent::Immediate, return_to, 1.0);
|
||||
ev->target2_sample = start;
|
||||
queue_event (ev);
|
||||
}
|
||||
|
||||
@@ -505,10 +505,8 @@ TransportFSM::maybe_reset_speed ()
|
||||
|
||||
if (Config->get_reset_default_speed_on_stop()) {
|
||||
|
||||
if (most_recently_requested_speed != 1.0 || default_speed() != 1.0) {
|
||||
set_default_speed(1.0);
|
||||
set_speed (Event (1.0));
|
||||
state_changed = true;
|
||||
if (most_recently_requested_speed != 1.0) {
|
||||
state_changed = set_speed (Event (1.0, false));
|
||||
}
|
||||
|
||||
} else {
|
||||
@@ -517,11 +515,11 @@ TransportFSM::maybe_reset_speed ()
|
||||
* speed change from whatever we have been rolling at to
|
||||
* whatever the current default is. We could have been
|
||||
* rewinding at -4.5 ... when we restart, we need to play at
|
||||
* the current _default_speed
|
||||
* the current _default_transport_speed
|
||||
*/
|
||||
|
||||
if (most_recently_requested_speed != _default_speed) {
|
||||
state_changed = set_speed (Event (_default_speed));
|
||||
state_changed = set_speed (Event (_default_speed, false));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -804,6 +802,10 @@ TransportFSM::set_speed (Event const & ev)
|
||||
|
||||
most_recently_requested_speed = ev.speed;
|
||||
|
||||
if (ev.as_default) {
|
||||
_default_speed = ev.speed;
|
||||
}
|
||||
|
||||
if (must_reverse) {
|
||||
|
||||
/* direction change */
|
||||
|
||||
@@ -200,13 +200,13 @@ BasicUI::button_varispeed (bool fwd)
|
||||
|
||||
if (fwd) {
|
||||
if (transport_speed <= 0) {
|
||||
session->request_transport_speed (1.0);
|
||||
session->request_transport_speed (1.0, false);
|
||||
session->request_roll (TRS_UI);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (transport_speed >= 0) {
|
||||
session->request_transport_speed (-1.0);
|
||||
session->request_transport_speed (-1.0, false);
|
||||
session->request_roll (TRS_UI);
|
||||
return;
|
||||
}
|
||||
@@ -221,12 +221,12 @@ BasicUI::button_varispeed (bool fwd)
|
||||
|
||||
if (fwd) {
|
||||
if (transport_speed <= 0) {
|
||||
session->request_transport_speed (1.0);
|
||||
session->request_transport_speed (1.0, false);
|
||||
session->request_roll (TRS_UI);
|
||||
}
|
||||
} else {
|
||||
if (transport_speed >= 0) {
|
||||
session->request_transport_speed (-1.0);
|
||||
session->request_transport_speed (-1.0, false);
|
||||
session->request_roll (TRS_UI);
|
||||
}
|
||||
}
|
||||
@@ -272,7 +272,7 @@ BasicUI::button_varispeed (bool fwd)
|
||||
|
||||
speed = semitone_ratio * transport_speed;
|
||||
speed = std::max (-maxspeed, std::min (maxspeed, speed));
|
||||
session->request_transport_speed (speed);
|
||||
session->request_transport_speed (speed, false);
|
||||
session->request_roll (TRS_UI);
|
||||
}
|
||||
|
||||
@@ -374,7 +374,7 @@ BasicUI::transport_play (bool from_last_start)
|
||||
}
|
||||
|
||||
if (rolling) {
|
||||
session->request_transport_speed (1.0, TRS_UI);
|
||||
session->request_transport_speed (1.0, false, TRS_UI);
|
||||
} else {
|
||||
session->request_roll ();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user