Move level meter fields out of struct alsa_card
Create a levels struct managed inside window-levels.c.
This commit is contained in:
@@ -161,7 +161,6 @@ struct alsa_card {
|
|||||||
struct pollfd pfd;
|
struct pollfd pfd;
|
||||||
GArray *elems;
|
GArray *elems;
|
||||||
struct alsa_elem *sample_capture_elem;
|
struct alsa_elem *sample_capture_elem;
|
||||||
struct alsa_elem *level_meter_elem;
|
|
||||||
GArray *routing_srcs;
|
GArray *routing_srcs;
|
||||||
GArray *routing_snks;
|
GArray *routing_snks;
|
||||||
GIOChannel *io_channel;
|
GIOChannel *io_channel;
|
||||||
@@ -183,8 +182,6 @@ struct alsa_card {
|
|||||||
GtkWidget *routing_dsp_out_grid;
|
GtkWidget *routing_dsp_out_grid;
|
||||||
GtkWidget *routing_mixer_in_grid;
|
GtkWidget *routing_mixer_in_grid;
|
||||||
GtkWidget *routing_mixer_out_grid;
|
GtkWidget *routing_mixer_out_grid;
|
||||||
GtkWidget *meters[MAX_METERS];
|
|
||||||
guint meter_gsource_timer;
|
|
||||||
int has_speaker_switching;
|
int has_speaker_switching;
|
||||||
int has_talkback;
|
int has_talkback;
|
||||||
int routing_out_count[PC_COUNT];
|
int routing_out_count[PC_COUNT];
|
||||||
|
|||||||
@@ -114,10 +114,6 @@ void destroy_card_window(struct alsa_card *card) {
|
|||||||
gtk_window_destroy(GTK_WINDOW(card->window_modal));
|
gtk_window_destroy(GTK_WINDOW(card->window_modal));
|
||||||
}
|
}
|
||||||
|
|
||||||
// disable the level meter timer source
|
|
||||||
if (card->meter_gsource_timer)
|
|
||||||
g_source_remove(card->meter_gsource_timer);
|
|
||||||
|
|
||||||
// if last window, display the "no card found" blank window
|
// if last window, display the "no card found" blank window
|
||||||
window_count--;
|
window_count--;
|
||||||
create_no_card_window();
|
create_no_card_window();
|
||||||
|
|||||||
@@ -23,10 +23,18 @@ static const double level_colours[] = {
|
|||||||
1.00, 0.00, 0.00 // -1/0
|
1.00, 0.00, 0.00 // -1/0
|
||||||
};
|
};
|
||||||
|
|
||||||
static int update_levels_controls(void *user_data) {
|
struct levels {
|
||||||
struct alsa_card *card = user_data;
|
struct alsa_card *card;
|
||||||
|
struct alsa_elem *level_meter_elem;
|
||||||
|
GtkWidget *meters[MAX_METERS];
|
||||||
|
guint timer;
|
||||||
|
};
|
||||||
|
|
||||||
struct alsa_elem *level_meter_elem = card->level_meter_elem;
|
static int update_levels_controls(void *user_data) {
|
||||||
|
struct levels *data = user_data;
|
||||||
|
struct alsa_card *card = data->card;
|
||||||
|
|
||||||
|
struct alsa_elem *level_meter_elem = data->level_meter_elem;
|
||||||
|
|
||||||
int *values = alsa_get_elem_int_values(level_meter_elem);
|
int *values = alsa_get_elem_int_values(level_meter_elem);
|
||||||
|
|
||||||
@@ -37,7 +45,7 @@ static int update_levels_controls(void *user_data) {
|
|||||||
|
|
||||||
// go through the ports in that category
|
// go through the ports in that category
|
||||||
for (int j = 0; j < card->routing_out_count[i]; j++) {
|
for (int j = 0; j < card->routing_out_count[i]; j++) {
|
||||||
GtkWidget *meter = card->meters[meter_num];
|
GtkWidget *meter = data->meters[meter_num];
|
||||||
double value = 20 * log10(values[meter_num] / 4095.0);
|
double value = 20 * log10(values[meter_num] / 4095.0);
|
||||||
|
|
||||||
gtk_dial_set_value(GTK_DIAL(meter), value);
|
gtk_dial_set_value(GTK_DIAL(meter), value);
|
||||||
@@ -61,23 +69,18 @@ static GtkWidget *add_count_label(GtkGrid *grid, int count) {
|
|||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct alsa_elem *get_level_meter_elem(struct alsa_card *card) {
|
static void on_destroy(GtkWidget *widget, struct levels *data) {
|
||||||
GArray *elems = card->elems;
|
if (data->timer)
|
||||||
|
g_source_remove(data->timer);
|
||||||
|
|
||||||
for (int i = 0; i < elems->len; i++) {
|
g_free(data);
|
||||||
struct alsa_elem *elem = &g_array_index(elems, struct alsa_elem, i);
|
|
||||||
|
|
||||||
if (!elem->card)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (strcmp(elem->name, "Level Meter") == 0)
|
|
||||||
return elem;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget *create_levels_controls(struct alsa_card *card) {
|
GtkWidget *create_levels_controls(struct alsa_card *card) {
|
||||||
|
struct levels *data = g_malloc0(sizeof(struct levels));
|
||||||
|
|
||||||
|
data->card = card;
|
||||||
|
|
||||||
GtkWidget *top = gtk_frame_new(NULL);
|
GtkWidget *top = gtk_frame_new(NULL);
|
||||||
gtk_widget_add_css_class(top, "window-frame");
|
gtk_widget_add_css_class(top, "window-frame");
|
||||||
|
|
||||||
@@ -93,8 +96,8 @@ GtkWidget *create_levels_controls(struct alsa_card *card) {
|
|||||||
|
|
||||||
int meter_num = 0;
|
int meter_num = 0;
|
||||||
|
|
||||||
card->level_meter_elem = get_level_meter_elem(card);
|
data->level_meter_elem = get_elem_by_name(card->elems, "Level Meter");
|
||||||
if (!card->level_meter_elem) {
|
if (!data->level_meter_elem) {
|
||||||
printf("Level Meter control not found\n");
|
printf("Level Meter control not found\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -135,21 +138,22 @@ GtkWidget *create_levels_controls(struct alsa_card *card) {
|
|||||||
// HW Output off_db is -55db; otherwise -45db
|
// HW Output off_db is -55db; otherwise -45db
|
||||||
gtk_dial_set_off_db(GTK_DIAL(meter), i == PC_HW ? -55 : -45);
|
gtk_dial_set_off_db(GTK_DIAL(meter), i == PC_HW ? -55 : -45);
|
||||||
|
|
||||||
card->meters[meter_num++] = meter;
|
data->meters[meter_num++] = meter;
|
||||||
gtk_grid_attach(GTK_GRID(grid), meter, j + 1, row, 1, 1);
|
gtk_grid_attach(GTK_GRID(grid), meter, j + 1, row, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
row++;
|
row++;
|
||||||
}
|
}
|
||||||
|
|
||||||
int elem_count = card->level_meter_elem->count;
|
int elem_count = data->level_meter_elem->count;
|
||||||
if (meter_num != elem_count) {
|
if (meter_num != elem_count) {
|
||||||
printf("meter_num is %d but elem count is %d\n", meter_num, elem_count);
|
printf("meter_num is %d but elem count is %d\n", meter_num, elem_count);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
card->level_meter_elem->count = elem_count;
|
data->level_meter_elem->count = elem_count;
|
||||||
|
|
||||||
card->meter_gsource_timer = g_timeout_add(50, update_levels_controls, card);
|
data->timer = g_timeout_add(50, update_levels_controls, data);
|
||||||
|
g_object_weak_ref(G_OBJECT(levels_top), (GWeakNotify)on_destroy, data);
|
||||||
|
|
||||||
return top;
|
return top;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user