Add configurable taper to GtkDial

The taper was previously set to a log function which matched the
Clarett volume knob. Add linear option to match the Scarlett 4th Gen
input gain knobs and hardware level meters.
This commit is contained in:
Geoffrey D. Bennett
2024-01-17 16:03:56 +10:30
parent 189b9ff6f6
commit 492c348897
7 changed files with 83 additions and 8 deletions

View File

@@ -84,6 +84,7 @@ enum {
PROP_ADJUSTMENT,
PROP_ROUND_DIGITS,
PROP_ZERO_DB,
PROP_TAPER,
LAST_PROP
};
@@ -117,6 +118,7 @@ struct _GtkDial {
int round_digits;
double zero_db;
int taper;
};
G_DEFINE_TYPE(GtkDial, gtk_dial, GTK_TYPE_WIDGET)
@@ -166,6 +168,18 @@ static double taper_log(double val) {
return (val - 0.1) / 0.9;
}
static double calc_taper(GtkDial *dial, double val) {
if (dial->taper == GTK_DIAL_TAPER_LINEAR)
return val;
if (dial->taper == GTK_DIAL_TAPER_LOG)
return taper_log(val);
g_warning("Invalid taper value: %d", dial->taper);
return val;
}
static double calc_val(double valp, double mn, double mx) {
return (mx - mn) * valp + mn;
}
@@ -201,7 +215,7 @@ static void get_dial_properties(
double mn = dial->adj ? gtk_adjustment_get_lower(dial->adj) : 0;
double mx = dial->adj ? gtk_adjustment_get_upper(dial->adj) : 1;
double value = dial->adj ? gtk_adjustment_get_value(dial->adj) : 0.25;
props->valp = taper_log(calc_valp(value, mn, mx));
props->valp = calc_taper(dial, calc_valp(value, mn, mx));
props->angle = calc_val(props->valp, ANGLE_START, ANGLE_END);
double radius = props->radius - props->thickness / 2;
@@ -287,6 +301,20 @@ static void gtk_dial_class_init(GtkDialClass *klass) {
G_PARAM_READWRITE | G_PARAM_CONSTRUCT
);
/**
* GtkDial:taper: (attributes org.gtk.Method.get=gtk_dial_get_taper org.gtk.Method.set=gtk_dial_set_taper)
*
* The taper of the dial.
*/
properties[PROP_TAPER] = g_param_spec_int(
"taper",
"Taper",
"The taper of the dial",
GTK_DIAL_TAPER_LINEAR, GTK_DIAL_TAPER_LOG,
GTK_DIAL_TAPER_LINEAR,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT
);
g_object_class_install_properties(g_class, LAST_PROP, properties);
/**
@@ -525,6 +553,9 @@ static void gtk_dial_set_property(
case PROP_ZERO_DB:
gtk_dial_set_zero_db(dial, g_value_get_double(value));
break;
case PROP_TAPER:
gtk_dial_set_taper(dial, g_value_get_int(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -549,6 +580,9 @@ static void gtk_dial_get_property(
case PROP_ZERO_DB:
g_value_set_double(value, dial->zero_db);
break;
case PROP_TAPER:
g_value_set_int(value, dial->taper);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -581,6 +615,14 @@ double gtk_dial_get_zero_db(GtkDial *dial) {
return dial->zero_db;
}
void gtk_dial_set_taper(GtkDial *dial, int taper) {
dial->taper = taper;
}
int gtk_dial_get_taper(GtkDial *dial) {
return dial->taper;
}
gboolean gtk_dial_set_style(
GtkDial *dial,
const char *trough_border,