Combine gain and volume widgets
Remove volume widget and make the gain widget choose the appropriate format string.
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
#include "widget-boolean.h"
|
#include "widget-boolean.h"
|
||||||
#include "widget-combo.h"
|
#include "widget-combo.h"
|
||||||
#include "widget-dual.h"
|
#include "widget-dual.h"
|
||||||
#include "widget-volume.h"
|
#include "widget-gain.h"
|
||||||
#include "window-helper.h"
|
#include "window-helper.h"
|
||||||
#include "window-levels.h"
|
#include "window-levels.h"
|
||||||
#include "window-mixer.h"
|
#include "window-mixer.h"
|
||||||
@@ -290,7 +290,7 @@ static void create_output_controls(
|
|||||||
// output controls
|
// output controls
|
||||||
if (strncmp(elem->name, "Line", 4) == 0) {
|
if (strncmp(elem->name, "Line", 4) == 0) {
|
||||||
if (strstr(elem->name, "Playback Volume")) {
|
if (strstr(elem->name, "Playback Volume")) {
|
||||||
w = make_volume_alsa_elem(elem);
|
w = make_gain_alsa_elem(elem);
|
||||||
gtk_grid_attach(
|
gtk_grid_attach(
|
||||||
GTK_GRID(output_grid), w, line_num - 1 + line_1_col, 1, 1, 1
|
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”."
|
"outputs which have been set to “HW”."
|
||||||
);
|
);
|
||||||
gtk_grid_attach(GTK_GRID(output_grid), l, 0, 0, 1, 1);
|
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);
|
gtk_grid_attach(GTK_GRID(output_grid), w, 0, 1, 1, 1);
|
||||||
} else if (strcmp(elem->name, "Mute Playback Switch") == 0) {
|
} else if (strcmp(elem->name, "Mute Playback Switch") == 0) {
|
||||||
w = make_boolean_alsa_elem(
|
w = make_boolean_alsa_elem(
|
||||||
|
|||||||
@@ -14,14 +14,20 @@ static void gain_updated(struct alsa_elem *elem) {
|
|||||||
int is_writable = alsa_get_elem_writable(elem);
|
int is_writable = alsa_get_elem_writable(elem);
|
||||||
gtk_widget_set_sensitive(elem->widget, is_writable);
|
gtk_widget_set_sensitive(elem->widget, is_writable);
|
||||||
|
|
||||||
int value = alsa_get_elem_value(elem);
|
int alsa_value = alsa_get_elem_value(elem);
|
||||||
gtk_dial_set_value(GTK_DIAL(elem->widget), value);
|
gtk_dial_set_value(GTK_DIAL(elem->widget), alsa_value);
|
||||||
|
|
||||||
char s[20];
|
char s[20];
|
||||||
float scale = (float)(elem->max_dB - elem->min_dB) /
|
float scale = (float)(elem->max_dB - elem->min_dB) /
|
||||||
(elem->max_val - elem->min_val);
|
(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);
|
gtk_label_set_text(GTK_LABEL(elem->widget2), s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,60 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Geoffrey D. Bennett <g@b4.vu>
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Geoffrey D. Bennett <g@b4.vu>
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
|
|
||||||
#include "alsa.h"
|
|
||||||
|
|
||||||
GtkWidget *make_volume_alsa_elem(struct alsa_elem *alsa_elem);
|
|
||||||
Reference in New Issue
Block a user