Fix various shuttle ctrl issues

This reverts most of 50c555f1a1

* Never render from `map_transport_state()` callback
* re-instantiate deadzone, only update when last_speed_displayed
  differs by 0.5%
* Fix Pool OOM due to mapping state doing direct UI changes
  instead of delegating this to lower priority render()
This commit is contained in:
Robin Gareus 2021-07-19 17:18:30 +02:00
parent 3582c16871
commit e9ed448994
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
1 changed files with 43 additions and 54 deletions

View File

@ -245,6 +245,10 @@ ShuttleControl::do_blink (bool onoff)
{
if (!shuttle_grabbed && _session && _session->default_play_speed () != 1.0) {
_vari_button.set_active (onoff);
if (_session->actual_speed () == 0) {
/* update info button text */
queue_draw ();
}
} else {
_vari_button.set_active (false);
}
@ -298,61 +302,11 @@ void
ShuttleControl::map_transport_state ()
{
float speed = 0.0;
float actual_speed = 0.0;
char buf[32];
if (_session) {
speed = _session->actual_speed ();
actual_speed = speed;
if (shuttle_grabbed) {
speed = requested_speed;
} else if (_session->default_play_speed () != 1.0) {
/*use has selected a varispeed AND the shuttle widget is not held ... show the varispeed*/
actual_speed = _session->default_play_speed ();
}
speed = _session->actual_speed ();
}
if (actual_speed != 0) {
if (_session->default_play_speed () == 1.0) {
if (actual_speed == _session->default_play_speed ()) {
snprintf (buf, sizeof (buf), "%s", _("Play"));
} else if (Config->get_shuttle_units () == Percentage) {
{
if (actual_speed < 0.0) {
snprintf (buf, sizeof (buf), "< %.1f%%", -actual_speed * 100.f);
} else {
snprintf (buf, sizeof (buf), "> %.1f%%", actual_speed * 100.f);
}
}
} else {
bool reversed;
int semi = speed_as_semitones (actual_speed, reversed);
if (reversed) {
snprintf (buf, sizeof (buf), _("< %+2d st"), semi);
} else {
snprintf (buf, sizeof (buf), _("> %+2d st"), semi);
}
}
} else { /*default_play_speed (varispeed) is always forward */
if (Config->get_shuttle_units () == Percentage) {
snprintf (buf, sizeof (buf), "%.1f%%", actual_speed * 100.f);
} else {
bool reversed;
int semi = speed_as_semitones (actual_speed, reversed);
if (abs (semi) < 1) {
int cents = speed_as_cents (actual_speed, reversed);
snprintf (buf, sizeof (buf), _("%+2d c"), cents);
} else {
snprintf (buf, sizeof (buf), _("%+2d st"), semi);
}
}
}
} else {
snprintf (buf, sizeof (buf), "%s", _("Stop"));
}
_info_button.set_text (buf);
if ((fabsf (speed - last_speed_displayed) < 0.005f) // dead-zone
&& !(speed == 1.f && last_speed_displayed != 1.f)
&& !(speed == 0.f && last_speed_displayed != 0.f)) {
@ -695,9 +649,15 @@ ShuttleControl::render (Cairo::RefPtr<Cairo::Context> const& ctx, cairo_rectangl
}
cairo_stroke (cr);
float speed = 0.0;
float speed = 0.0;
float actual_speed = 0.0;
float default_speed = 1.0;
char buf[32];
if (_session) {
speed = _session->actual_speed ();
speed = _session->actual_speed ();
actual_speed = speed;
default_speed = _session->default_play_speed ();
if (shuttle_grabbed) {
speed = requested_speed;
}
@ -725,7 +685,36 @@ ShuttleControl::render (Cairo::RefPtr<Cairo::Context> const& ctx, cairo_rectangl
}
cairo_fill (cr);
last_speed_displayed = speed;
/* text */
if (actual_speed == 1.0) {
snprintf (buf, sizeof (buf), "%s", _("Play"));
} else if (actual_speed == 0 && default_speed == 1.0) {
snprintf (buf, sizeof (buf), "%s", _("Stop"));
} else {
if (actual_speed == 0) {
/*default_play_speed (varispeed) is always forward */
actual_speed = default_speed;
}
if (Config->get_shuttle_units() == Percentage) {
if (actual_speed < 0.0) {
snprintf (buf, sizeof (buf), "< %.1f%%", -actual_speed * 100.f);
} else {
snprintf (buf, sizeof (buf), "> %.1f%%", actual_speed * 100.f);
}
} else {
bool reversed;
int semi = speed_as_semitones (actual_speed, reversed);
if (reversed) {
snprintf (buf, sizeof (buf), _("< %+2d st"), semi);
} else {
snprintf (buf, sizeof (buf), _("> %+2d st"), semi);
}
}
}
last_speed_displayed = actual_speed;
_info_button.set_text (buf);
#if 0
if (UIConfiguration::instance().get_widget_prelight()) {