summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/shuttle_control.cc28
-rw-r--r--gtk2_ardour/shuttle_control.h9
-rw-r--r--libs/surfaces/generic_midi/midicontrollable.cc4
3 files changed, 19 insertions, 22 deletions
diff --git a/gtk2_ardour/shuttle_control.cc b/gtk2_ardour/shuttle_control.cc
index b4095f7c0c..7096cd31bb 100644
--- a/gtk2_ardour/shuttle_control.cc
+++ b/gtk2_ardour/shuttle_control.cc
@@ -427,10 +427,10 @@ ShuttleControl::mouse_shuttle (double x, bool force)
}
void
-ShuttleControl::set_shuttle_fract (double f)
+ShuttleControl::set_shuttle_fract (double f, bool zero_ok)
{
shuttle_fract = f;
- use_shuttle_fract (false);
+ use_shuttle_fract (false, zero_ok);
}
int
@@ -472,7 +472,7 @@ ShuttleControl::fract_as_semitones (float fract, bool& reverse)
}
void
-ShuttleControl::use_shuttle_fract (bool force)
+ShuttleControl::use_shuttle_fract (bool force, bool zero_ok)
{
microseconds_t now = get_microseconds();
@@ -503,7 +503,11 @@ ShuttleControl::use_shuttle_fract (bool force)
speed = shuttle_max_speed * shuttle_fract;
}
- _session->request_transport_speed_nonzero (speed, Config->get_shuttle_behaviour() == Wheel);
+ if (zero_ok) {
+ _session->request_transport_speed (speed, Config->get_shuttle_behaviour() == Wheel);
+ } else {
+ _session->request_transport_speed_nonzero (speed, Config->get_shuttle_behaviour() == Wheel);
+ }
}
void
@@ -657,25 +661,13 @@ ShuttleControl::ShuttleControllable::ShuttleControllable (ShuttleControl& s)
void
ShuttleControl::ShuttleControllable::set_value (double val)
{
- double fract;
-
- if (val == 0.5) {
- fract = 0.0;
- } else {
- if (val < 0.5) {
- fract = -((0.5 - val)/0.5);
- } else {
- fract = ((val - 0.5)/0.5);
- }
- }
-
- sc.set_shuttle_fract (fract);
+ sc.set_shuttle_fract ((val - lower()) / (upper() - lower()), true);
}
double
ShuttleControl::ShuttleControllable::get_value () const
{
- return sc.get_shuttle_fract ();
+ return lower() + (sc.get_shuttle_fract () * (upper() - lower()));
}
void
diff --git a/gtk2_ardour/shuttle_control.h b/gtk2_ardour/shuttle_control.h
index c16328e384..a8c2e71d59 100644
--- a/gtk2_ardour/shuttle_control.h
+++ b/gtk2_ardour/shuttle_control.h
@@ -40,7 +40,7 @@ class ShuttleControl : public CairoWidget, public ARDOUR::SessionHandlePtr
void map_transport_state ();
void update_speed_display ();
- void set_shuttle_fract (double);
+ void set_shuttle_fract (double, bool zero_ok = false);
double get_shuttle_fract () const { return shuttle_fract; }
void set_session (ARDOUR::Session*);
@@ -49,6 +49,9 @@ class ShuttleControl : public CairoWidget, public ARDOUR::SessionHandlePtr
void set_value (double);
double get_value (void) const;
+ double lower() const { return -1.0; }
+ double upper() const { return 1.0; }
+
ShuttleControl& sc;
};
@@ -89,8 +92,8 @@ class ShuttleControl : public CairoWidget, public ARDOUR::SessionHandlePtr
void on_size_allocate (Gtk::Allocation&);
bool on_query_tooltip (int, int, bool, const Glib::RefPtr<Gtk::Tooltip>&);
- gint mouse_shuttle (double x, bool force);
- void use_shuttle_fract (bool force);
+ gint mouse_shuttle (double x, bool force);
+ void use_shuttle_fract (bool force, bool zero_ok = false);
void parameter_changed (std::string);
void set_shuttle_units (ARDOUR::ShuttleUnits);
diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc
index 71021e9c84..488ac557bb 100644
--- a/libs/surfaces/generic_midi/midicontrollable.cc
+++ b/libs/surfaces/generic_midi/midicontrollable.cc
@@ -122,6 +122,8 @@ MIDIControllable::set_controllable (Controllable* c)
controllable = c;
+ last_controllable_value = controllable->get_value();
+
if (controllable) {
controllable->Destroyed.connect (controllable_death_connection, MISSING_INVALIDATOR,
boost::bind (&MIDIControllable::drop_controllable, this),
@@ -228,7 +230,6 @@ MIDIControllable::lookup_controllable()
void
MIDIControllable::drop_controllable ()
{
- cerr << "removed controllable " << controllable << "\n";
set_controllable (0);
}
@@ -272,6 +273,7 @@ MIDIControllable::midi_sense_controller (Parser &, EventTwoBytes *msg)
if (control_additional == msg->controller_number) {
if (!controllable->is_toggle()) {
+
float new_value = msg->value;
float max_value = max(last_controllable_value, new_value);
float min_value = min(last_controllable_value, new_value);