diff --git a/src/iface-mixer.c b/src/iface-mixer.c index 39b3646..8f41d5a 100644 --- a/src/iface-mixer.c +++ b/src/iface-mixer.c @@ -8,7 +8,7 @@ #include "widget-boolean.h" #include "widget-combo.h" #include "widget-dual.h" -#include "widget-volume.h" +#include "widget-gain.h" #include "window-helper.h" #include "window-levels.h" #include "window-mixer.h" @@ -290,7 +290,7 @@ static void create_output_controls( // output controls if (strncmp(elem->name, "Line", 4) == 0) { if (strstr(elem->name, "Playback Volume")) { - w = make_volume_alsa_elem(elem); + w = make_gain_alsa_elem(elem); gtk_grid_attach( GTK_GRID(output_grid), w, line_num - 1 + line_1_col, 1, 1, 1 ); @@ -331,7 +331,7 @@ static void create_output_controls( "outputs which have been set to “HW”." ); gtk_grid_attach(GTK_GRID(output_grid), l, 0, 0, 1, 1); - w = make_volume_alsa_elem(elem); + w = make_gain_alsa_elem(elem); gtk_grid_attach(GTK_GRID(output_grid), w, 0, 1, 1, 1); } else if (strcmp(elem->name, "Mute Playback Switch") == 0) { w = make_boolean_alsa_elem( diff --git a/src/widget-gain.c b/src/widget-gain.c index ed322e0..6b75a08 100644 --- a/src/widget-gain.c +++ b/src/widget-gain.c @@ -14,14 +14,20 @@ static void gain_updated(struct alsa_elem *elem) { int is_writable = alsa_get_elem_writable(elem); gtk_widget_set_sensitive(elem->widget, is_writable); - int value = alsa_get_elem_value(elem); - gtk_dial_set_value(GTK_DIAL(elem->widget), value); + int alsa_value = alsa_get_elem_value(elem); + gtk_dial_set_value(GTK_DIAL(elem->widget), alsa_value); char s[20]; float scale = (float)(elem->max_dB - elem->min_dB) / (elem->max_val - elem->min_val); - snprintf(s, 20, "%.1f", value * scale + elem->min_dB); + float value = (float)alsa_value * scale + elem->min_dB; + + if (scale < 1) + snprintf(s, 20, "%.1f", value); + else + snprintf(s, 20, "%.0fdB", value); + gtk_label_set_text(GTK_LABEL(elem->widget2), s); } diff --git a/src/widget-volume.c b/src/widget-volume.c deleted file mode 100644 index 61ef001..0000000 --- a/src/widget-volume.c +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Geoffrey D. Bennett -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "gtkdial.h" -#include "widget-volume.h" - -static void volume_changed(GtkWidget *widget, struct alsa_elem *elem) { - int value = gtk_dial_get_value(GTK_DIAL(widget)); - - alsa_set_elem_value(elem, value); -} - -static void volume_updated(struct alsa_elem *elem) { - int is_writable = alsa_get_elem_writable(elem); - gtk_widget_set_sensitive(elem->widget, is_writable); - - int value = alsa_get_elem_value(elem); - gtk_dial_set_value(GTK_DIAL(elem->widget), value); - - char s[20]; - float scale = (float)(elem->max_dB - elem->min_dB) / - (elem->max_val - elem->min_val); - - snprintf(s, 20, "%ddB", (int)(value * scale + elem->min_dB)); - gtk_label_set_text(GTK_LABEL(elem->widget2), s); -} - -GtkWidget *make_volume_alsa_elem(struct alsa_elem *elem) { - GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_set_hexpand(vbox, TRUE); - - GtkWidget *dial = gtk_dial_new_with_range( - elem->min_val, elem->max_val, 1 - ); - - // calculate 0dB value from min/max dB and min/max value - float scale = (float)(elem->max_dB - elem->min_dB) / - (elem->max_val - elem->min_val); - int zero_db_value = (int)((0 - elem->min_dB) / scale + elem->min_val); - - gtk_dial_set_zero_db(GTK_DIAL(dial), zero_db_value); - - gtk_widget_set_vexpand(dial, TRUE); - - g_signal_connect( - dial, "value-changed", G_CALLBACK(volume_changed), elem - ); - elem->widget = dial; - elem->widget_callback = volume_updated; - - GtkWidget *label = gtk_label_new(NULL); - elem->widget2 = label; - - volume_updated(elem); - - gtk_box_append(GTK_BOX(vbox), dial); - gtk_box_append(GTK_BOX(vbox), label); - - return vbox; -} diff --git a/src/widget-volume.h b/src/widget-volume.h deleted file mode 100644 index 842ca3d..0000000 --- a/src/widget-volume.h +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Geoffrey D. Bennett -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include - -#include "alsa.h" - -GtkWidget *make_volume_alsa_elem(struct alsa_elem *alsa_elem);