mirror of
https://github.com/alsa-project/alsa-tools.git
synced 2026-02-05 04:06:31 -05:00
envy24control: port to GTK 4
Closes: https://github.com/alsa-project/alsa-tools/pull/36 Signed-off-by: Andreas Persson <andreasp56@outlook.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
187eeecd14
commit
4b4886b5f9
8 changed files with 596 additions and 539 deletions
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
|
|
@ -13,7 +13,7 @@ jobs:
|
||||||
- name: Prepare environment
|
- name: Prepare environment
|
||||||
run: |
|
run: |
|
||||||
dnf -y upgrade
|
dnf -y upgrade
|
||||||
dnf -y install @development-tools gcc-c++ libtool bzip2 gtk2-devel gtk3-devel fltk-devel qt3-devel
|
dnf -y install @development-tools gawk gcc-c++ libtool bzip2 gtk2-devel gtk3-devel gtk4-devel fltk-devel qt3-devel
|
||||||
|
|
||||||
- name: Checkout alsa-lib
|
- name: Checkout alsa-lib
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
@ -98,7 +98,7 @@ jobs:
|
||||||
apt-get update
|
apt-get update
|
||||||
apt-get -y install apt-utils
|
apt-get -y install apt-utils
|
||||||
apt-get -y full-upgrade
|
apt-get -y full-upgrade
|
||||||
apt-get install -y git build-essential pkg-config m4 autoconf automake libtool ibgtk2.0-dev libgtk-3-dev libfltk1.3-dev
|
apt-get install -y git build-essential pkg-config m4 autoconf automake libtool ibgtk2.0-dev libgtk-3-dev libgtk-4-dev libfltk1.3-dev
|
||||||
|
|
||||||
- name: Checkout alsa-lib
|
- name: Checkout alsa-lib
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,6 @@ AC_HEADER_STDC
|
||||||
AM_INIT_AUTOMAKE
|
AM_INIT_AUTOMAKE
|
||||||
AM_MAINTAINER_MODE([enable])
|
AM_MAINTAINER_MODE([enable])
|
||||||
|
|
||||||
PKG_CHECK_MODULES(ENVY24CONTROL, gtk+-3.0 alsa >= 0.9.0)
|
PKG_CHECK_MODULES(ENVY24CONTROL, gtk4 alsa >= 0.9.0)
|
||||||
|
|
||||||
AC_OUTPUT(Makefile desktop/Makefile)
|
AC_OUTPUT(Makefile desktop/Makefile)
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -163,7 +163,7 @@ extern GtkWidget *av_adc_sense_radio[][4];
|
||||||
/* flags */
|
/* flags */
|
||||||
extern int card_is_dmx6fire;
|
extern int card_is_dmx6fire;
|
||||||
|
|
||||||
gboolean level_meters_draw_callback(GtkWidget *widget, cairo_t *cr, gpointer data);
|
GtkWidget *envy_level_meter_new(void);
|
||||||
gint level_meters_timeout_callback(gpointer data);
|
gint level_meters_timeout_callback(gpointer data);
|
||||||
void level_meters_reset_peaks(GtkButton *button, gpointer data);
|
void level_meters_reset_peaks(GtkButton *button, gpointer data);
|
||||||
void level_meters_init(void);
|
void level_meters_init(void);
|
||||||
|
|
|
||||||
|
|
@ -35,11 +35,11 @@ static snd_ctl_elem_value_t *phono_input;
|
||||||
static inline int is_update_needed(void);
|
static inline int is_update_needed(void);
|
||||||
|
|
||||||
#define toggle_set(widget, state) \
|
#define toggle_set(widget, state) \
|
||||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), state);
|
gtk_check_button_set_active(GTK_CHECK_BUTTON(widget), state);
|
||||||
|
|
||||||
static int is_active(GtkWidget *widget)
|
static int is_active(GtkWidget *widget)
|
||||||
{
|
{
|
||||||
return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? 1 : 0;
|
return gtk_check_button_get_active(GTK_CHECK_BUTTON(widget)) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void label_set(GtkWidget* widget, const char* str)
|
static void label_set(GtkWidget* widget, const char* str)
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,6 @@ static GdkRGBA *penOrangeShadow = NULL;
|
||||||
static GdkRGBA *penOrangeLight = NULL;
|
static GdkRGBA *penOrangeLight = NULL;
|
||||||
static GdkRGBA *penRedShadow = NULL;
|
static GdkRGBA *penRedShadow = NULL;
|
||||||
static GdkRGBA *penRedLight = NULL;
|
static GdkRGBA *penRedLight = NULL;
|
||||||
static int level[22] = { 0 };
|
|
||||||
static snd_ctl_elem_value_t *peaks;
|
static snd_ctl_elem_value_t *peaks;
|
||||||
|
|
||||||
extern int input_channels, output_channels, pcm_output_channels, spdif_channels, view_spdif_playback;
|
extern int input_channels, output_channels, pcm_output_channels, spdif_channels, view_spdif_playback;
|
||||||
|
|
@ -71,12 +70,12 @@ static int get_index(const gchar *name)
|
||||||
result = atoi(name + 5);
|
result = atoi(name + 5);
|
||||||
if (result < 1 || result > 20) {
|
if (result < 1 || result > 20) {
|
||||||
g_print("Wrong drawing area ID: %s\n", name);
|
g_print("Wrong drawing area ID: %s\n", name);
|
||||||
gtk_main_quit();
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void redraw_meters(int idx, int width, int height, int level1, int level2, cairo_t *cr)
|
static void redraw_meters(int idx, int width, int height, int level1, int level2, GtkSnapshot *snapshot)
|
||||||
{
|
{
|
||||||
int stereo = idx == 0;
|
int stereo = idx == 0;
|
||||||
int segment_width = stereo ? (width / 2) - 8 : width - 12;
|
int segment_width = stereo ? (width / 2) - 8 : width - 12;
|
||||||
|
|
@ -87,135 +86,108 @@ static void redraw_meters(int idx, int width, int height, int level1, int level2
|
||||||
int seg;
|
int seg;
|
||||||
int segs_on1 = ((segments * level1) + 128) / 255;
|
int segs_on1 = ((segments * level1) + 128) / 255;
|
||||||
int segs_on2 = ((segments * level2) + 128) / 255;
|
int segs_on2 = ((segments * level2) + 128) / 255;
|
||||||
int end_seg;
|
GdkRGBA black = { 0, 0, 0, 1 };
|
||||||
GdkRectangle clip;
|
|
||||||
|
|
||||||
// g_print("segs_on1 = %i (%i), segs_on2 = %i (%i)\n", segs_on1, level1, segs_on2, level2);
|
// g_print("segs_on1 = %i (%i), segs_on2 = %i (%i)\n", segs_on1, level1, segs_on2, level2);
|
||||||
cairo_rectangle(cr, 0, 0, width, height);
|
gtk_snapshot_append_color(snapshot, &black, &GRAPHENE_RECT_INIT(0, 0, width, height));
|
||||||
cairo_fill(cr);
|
for (seg = 0; seg < green_segments; seg++) {
|
||||||
|
gtk_snapshot_append_color(snapshot,
|
||||||
gdk_cairo_get_clip_rectangle(cr, &clip);
|
segs_on1 > 0 ? penGreenLight : penGreenShadow,
|
||||||
seg = segments - (clip.y + clip.height) / 4;
|
&GRAPHENE_RECT_INIT(
|
||||||
if (seg < 0)
|
6, 3 + ((segments - seg - 1) * 4),
|
||||||
seg = 0;
|
segment_width,
|
||||||
segs_on1 -= seg;
|
3));
|
||||||
segs_on2 -= seg;
|
|
||||||
end_seg = segments - (clip.y - 2) / 4;
|
|
||||||
|
|
||||||
for (; seg < green_segments && seg < end_seg; seg++) {
|
|
||||||
gdk_cairo_set_source_rgba(cr,
|
|
||||||
segs_on1 > 0 ? penGreenLight : penGreenShadow);
|
|
||||||
cairo_rectangle(cr,
|
|
||||||
6, 3 + ((segments - seg - 1) * 4),
|
|
||||||
segment_width,
|
|
||||||
3);
|
|
||||||
cairo_fill(cr);
|
|
||||||
if (stereo) {
|
if (stereo) {
|
||||||
gdk_cairo_set_source_rgba(cr,
|
gtk_snapshot_append_color(snapshot,
|
||||||
segs_on2 > 0 ? penGreenLight : penGreenShadow);
|
segs_on2 > 0 ? penGreenLight : penGreenShadow,
|
||||||
cairo_rectangle(cr,
|
&GRAPHENE_RECT_INIT(
|
||||||
2 + (width / 2),
|
2 + (width / 2),
|
||||||
3 + ((segments - seg - 1) * 4),
|
3 + ((segments - seg - 1) * 4),
|
||||||
segment_width,
|
segment_width,
|
||||||
3);
|
3));
|
||||||
cairo_fill(cr);
|
|
||||||
}
|
|
||||||
segs_on1--;
|
|
||||||
segs_on2--;
|
|
||||||
}
|
|
||||||
for (; seg < green_segments + orange_segments && seg < end_seg; seg++) {
|
|
||||||
gdk_cairo_set_source_rgba(cr,
|
|
||||||
segs_on1 > 0 ? penOrangeLight : penOrangeShadow);
|
|
||||||
cairo_rectangle(cr,
|
|
||||||
6, 3 + ((segments - seg - 1) * 4),
|
|
||||||
segment_width,
|
|
||||||
3);
|
|
||||||
cairo_fill(cr);
|
|
||||||
if (stereo) {
|
|
||||||
gdk_cairo_set_source_rgba(cr,
|
|
||||||
segs_on2 > 0 ? penOrangeLight : penOrangeShadow);
|
|
||||||
cairo_rectangle(cr,
|
|
||||||
2 + (width / 2),
|
|
||||||
3 + ((segments - seg - 1) * 4),
|
|
||||||
segment_width,
|
|
||||||
3);
|
|
||||||
cairo_fill(cr);
|
|
||||||
}
|
}
|
||||||
segs_on1--;
|
segs_on1--;
|
||||||
segs_on2--;
|
segs_on2--;
|
||||||
}
|
}
|
||||||
for (; seg < segments && seg < end_seg; seg++) {
|
for (; seg < green_segments + orange_segments; seg++) {
|
||||||
gdk_cairo_set_source_rgba(cr,
|
gtk_snapshot_append_color(snapshot,
|
||||||
segs_on1 > 0 ? penRedLight : penRedShadow);
|
segs_on1 > 0 ? penOrangeLight : penOrangeShadow,
|
||||||
cairo_rectangle(cr,
|
&GRAPHENE_RECT_INIT(
|
||||||
6, 3 + ((segments - seg - 1) * 4),
|
6, 3 + ((segments - seg - 1) * 4),
|
||||||
segment_width,
|
segment_width,
|
||||||
3);
|
3));
|
||||||
cairo_fill(cr);
|
|
||||||
if (stereo) {
|
if (stereo) {
|
||||||
gdk_cairo_set_source_rgba(cr,
|
gtk_snapshot_append_color(snapshot,
|
||||||
segs_on2 > 0 ? penRedLight : penRedShadow);
|
segs_on2 > 0 ? penOrangeLight : penOrangeShadow,
|
||||||
cairo_rectangle(cr,
|
&GRAPHENE_RECT_INIT(
|
||||||
2 + (width / 2),
|
2 + (width / 2),
|
||||||
3 + ((segments - seg - 1) * 4),
|
3 + ((segments - seg - 1) * 4),
|
||||||
segment_width,
|
segment_width,
|
||||||
3);
|
3));
|
||||||
cairo_fill(cr);
|
}
|
||||||
|
segs_on1--;
|
||||||
|
segs_on2--;
|
||||||
|
}
|
||||||
|
for (; seg < segments; seg++) {
|
||||||
|
gtk_snapshot_append_color(snapshot,
|
||||||
|
segs_on1 > 0 ? penRedLight : penRedShadow,
|
||||||
|
&GRAPHENE_RECT_INIT(
|
||||||
|
6, 3 + ((segments - seg - 1) * 4),
|
||||||
|
segment_width,
|
||||||
|
3));
|
||||||
|
if (stereo) {
|
||||||
|
gtk_snapshot_append_color(snapshot,
|
||||||
|
segs_on2 > 0 ? penRedLight : penRedShadow,
|
||||||
|
&GRAPHENE_RECT_INIT(
|
||||||
|
2 + (width / 2),
|
||||||
|
3 + ((segments - seg - 1) * 4),
|
||||||
|
segment_width,
|
||||||
|
3));
|
||||||
}
|
}
|
||||||
segs_on1--;
|
segs_on1--;
|
||||||
segs_on2--;
|
segs_on2--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean level_meters_draw_callback(GtkWidget *widget, cairo_t *cr, gpointer data)
|
#define ENVY_TYPE_LEVEL_METER envy_level_meter_get_type()
|
||||||
|
G_DECLARE_FINAL_TYPE(EnvyLevelMeter, envy_level_meter, ENVY, LEVEL_METER, GtkWidget)
|
||||||
|
|
||||||
|
struct _EnvyLevelMeter
|
||||||
|
{
|
||||||
|
GtkWidget parent_instance;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_FINAL_TYPE(EnvyLevelMeter, envy_level_meter, GTK_TYPE_WIDGET)
|
||||||
|
|
||||||
|
static void envy_level_meter_snapshot(GtkWidget *widget, GtkSnapshot *snapshot)
|
||||||
{
|
{
|
||||||
int idx = get_index(gtk_widget_get_name(widget));
|
int idx = get_index(gtk_widget_get_name(widget));
|
||||||
int l1, l2;
|
int l1, l2;
|
||||||
|
|
||||||
get_levels(idx, &l1, &l2);
|
get_levels(idx, &l1, &l2);
|
||||||
redraw_meters(idx, gtk_widget_get_allocated_width(widget), gtk_widget_get_allocated_height(widget), l1, l2, cr);
|
redraw_meters(idx, gtk_widget_get_width(widget), gtk_widget_get_height(widget), l1, l2, snapshot);
|
||||||
return FALSE;
|
}
|
||||||
|
|
||||||
|
static void envy_level_meter_class_init(EnvyLevelMeterClass *klass)
|
||||||
|
{
|
||||||
|
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
|
||||||
|
widget_class->snapshot = envy_level_meter_snapshot;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void envy_level_meter_init(EnvyLevelMeter *self)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
GtkWidget *envy_level_meter_new(void)
|
||||||
|
{
|
||||||
|
EnvyLevelMeter *self = g_object_new(ENVY_TYPE_LEVEL_METER, NULL);
|
||||||
|
return GTK_WIDGET(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_meter(int idx)
|
static void update_meter(int idx)
|
||||||
{
|
{
|
||||||
int stereo = idx == 0;
|
GtkWidget *widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
|
||||||
GtkWidget *widget = stereo ? mixer_mix_drawing : mixer_drawing[idx - 1];
|
gtk_widget_queue_draw(widget);
|
||||||
int width = gtk_widget_get_allocated_width(widget);
|
|
||||||
int height = gtk_widget_get_allocated_height(widget);
|
|
||||||
int segments = (height - 6) / 4;
|
|
||||||
int level_idx = stereo ? 20 : idx - 1;
|
|
||||||
int l1, l2, segs_on, old_segs_on, h;
|
|
||||||
|
|
||||||
get_levels(idx, &l1, &l2);
|
|
||||||
segs_on = ((segments * l1) + 128) / 255;
|
|
||||||
old_segs_on = ((segments * level[level_idx]) + 128) / 255;
|
|
||||||
h = abs(old_segs_on - segs_on);
|
|
||||||
level[level_idx] = l1;
|
|
||||||
|
|
||||||
if (h > 0) {
|
|
||||||
int y = segments - MAX(old_segs_on, segs_on);
|
|
||||||
gtk_widget_queue_draw_area(widget,
|
|
||||||
6, 4 * y + 3,
|
|
||||||
stereo ? (width / 2) - 8 : width - 12,
|
|
||||||
4 * h - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stereo) {
|
|
||||||
level_idx++;
|
|
||||||
segs_on = ((segments * l2) + 128) / 255;
|
|
||||||
old_segs_on = ((segments * level[level_idx]) + 128) / 255;
|
|
||||||
h = abs(old_segs_on - segs_on);
|
|
||||||
level[level_idx] = l2;
|
|
||||||
|
|
||||||
if (h > 0) {
|
|
||||||
int y = segments - MAX(old_segs_on, segs_on);
|
|
||||||
gtk_widget_queue_draw_area(widget,
|
|
||||||
2 + (width / 2), 4 * y + 3,
|
|
||||||
(width / 2) - 8,
|
|
||||||
4 * h - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gint level_meters_timeout_callback(gpointer data)
|
gint level_meters_timeout_callback(gpointer data)
|
||||||
|
|
|
||||||
|
|
@ -23,14 +23,14 @@
|
||||||
#define ANALOG_PLAYBACK_ROUTE_NAME "H/W Playback Route"
|
#define ANALOG_PLAYBACK_ROUTE_NAME "H/W Playback Route"
|
||||||
|
|
||||||
#define toggle_set(widget, state) \
|
#define toggle_set(widget, state) \
|
||||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), state);
|
gtk_check_button_set_active(GTK_CHECK_BUTTON(widget), state);
|
||||||
|
|
||||||
static int stream_active[MAX_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS];
|
static int stream_active[MAX_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS];
|
||||||
extern int output_channels, input_channels, pcm_output_channels, spdif_channels;
|
extern int output_channels, input_channels, pcm_output_channels, spdif_channels;
|
||||||
|
|
||||||
static int is_active(GtkWidget *widget)
|
static int is_active(GtkWidget *widget)
|
||||||
{
|
{
|
||||||
return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? 1 : 0;
|
return gtk_check_button_get_active(GTK_CHECK_BUTTON(widget)) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_toggle_index(int stream)
|
static int get_toggle_index(int stream)
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
#include "envy24control.h"
|
#include "envy24control.h"
|
||||||
|
|
||||||
#define toggle_set(widget, state) \
|
#define toggle_set(widget, state) \
|
||||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), state);
|
gtk_check_button_set_active(GTK_CHECK_BUTTON(widget), state);
|
||||||
|
|
||||||
#define DAC_VOLUME_NAME "DAC Volume"
|
#define DAC_VOLUME_NAME "DAC Volume"
|
||||||
#define ADC_VOLUME_NAME "ADC Volume"
|
#define ADC_VOLUME_NAME "ADC Volume"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue