a few small fixes that help pitchbend control of things, notably the shuttle controller. but note that basically, teh shuttle controller is completely and hopelessly broken through excess complexity and incorrect design

git-svn-id: svn://localhost/ardour2/branches/3.0@13870 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2013-01-17 14:48:17 +00:00
parent 4ecb07aaee
commit 5adcb61f60
3 changed files with 19 additions and 22 deletions

View File

@ -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

View File

@ -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);

View File

@ -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);