Skip to content

Commit 80f2c41

Browse files
committed
Allow configuring HPF cutoff frequency from audio setup dialog
Add a control to the setup dialog for the HPF cutoff frequency. Also save it to the config file. Slider has ticks for Off and also for the default 3kHz frequency. The fill level of the slider is set to limit the cutoff to the Nyquist frequency of the selected sampling rate. To do that, I needed to get a callback on rate combobox change, and the manual entry of the combobox made that a challenge.
1 parent 5aa2b62 commit 80f2c41

2 files changed

Lines changed: 42 additions & 4 deletions

File tree

‎src/interface.c‎

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,21 @@ static int get_rate(GtkComboBox *rate_list)
612612
return rate;
613613
}
614614

615+
static void rate_entered(GtkWidget *rate_entry, struct main_window *w)
616+
{
617+
UNUSED(rate_entry);
618+
gtk_range_set_fill_level(w->hpf_range, get_rate(w->rate_list) / 2);
619+
}
620+
621+
static void rate_changed(GtkWidget *rate_list, struct main_window *w)
622+
{
623+
/* Only act on combo list selections, not on every keystroke of manual
624+
* entry. rate_entered() will handle manual entry finished. */
625+
if (gtk_combo_box_get_active(GTK_COMBO_BOX(rate_list)) == -1)
626+
return;
627+
gtk_range_set_fill_level(w->hpf_range, get_rate(w->rate_list) / 2);
628+
}
629+
615630
static void populate_rate_list(GtkComboBox *rate_list, unsigned int current_rate, unsigned int rates)
616631
{
617632
unsigned int i;
@@ -620,6 +635,7 @@ static void populate_rate_list(GtkComboBox *rate_list, unsigned int current_rate
620635
static const char * const labels[] = AUDIO_RATE_LABELS;
621636

622637
int active = -1; // -1 will set no active entry
638+
g_signal_handlers_block_matched(G_OBJECT(rate_list), G_SIGNAL_MATCH_FUNC, 0,0,NULL, rate_changed, NULL);
623639
GtkListStore *list = GTK_LIST_STORE(gtk_combo_box_get_model(rate_list));
624640
gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list), &iter);
625641
for(i=0; i < ARRAY_SIZE(freqs); i++, gtk_tree_model_iter_next(GTK_TREE_MODEL(list), &iter)) {
@@ -633,6 +649,7 @@ static void populate_rate_list(GtkComboBox *rate_list, unsigned int current_rate
633649
if (supported && current_rate == freqs[i])
634650
active = i;
635651
}
652+
g_signal_handlers_unblock_matched(G_OBJECT(rate_list), G_SIGNAL_MATCH_FUNC, 0,0,NULL, rate_changed, NULL);
636653
gtk_combo_box_set_active(rate_list, active);
637654
if (active == -1) {
638655
GtkWidget *entry = gtk_bin_get_child(GTK_BIN(rate_list));
@@ -695,18 +712,21 @@ static void audio_setup(GtkMenuItem *m, struct main_window *w)
695712
if (new_rate == -1)
696713
new_rate = w->nominal_sr; /* clear entry too? */
697714

698-
i = set_audio_device(selected, &new_rate, NULL, FILTER_CUTOFF, w->is_light);
715+
int hpf_freq = gtk_range_get_value(w->hpf_range);
716+
717+
i = set_audio_device(selected, &new_rate, NULL, hpf_freq, w->is_light);
699718
if (i == 0) {
700719
w->nominal_sr = new_rate;
701720
// Only save settings to config if it worked
702721
w->audio_rate = new_rate;
722+
w->hpf_freq = hpf_freq;
703723
// If selected dev is the default, save -1 "default" to config
704724
w->audio_device = devices[selected].isdefault ? -1 : selected;
705725
recompute(w);
706726
} else if (i < 0) {
707727
/* Try to restore old settings */
708728
new_rate = w->nominal_sr;
709-
i = set_audio_device(current_dev, &new_rate, NULL, FILTER_CUTOFF, w->is_light);
729+
i = set_audio_device(current_dev, &new_rate, NULL, w->hpf_freq, w->is_light);
710730
if (i < 0)
711731
error("Unable to restore previous audio settings. Audio not working.");
712732
}
@@ -913,9 +933,23 @@ static void init_audio_dialog(struct main_window *w)
913933
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(rates), renderer, "text", 0, "sensitive", 1, NULL);
914934
gtk_grid_attach(grid, rates, 1, 1, 1, 1);
915935

936+
gtk_grid_attach(grid, label = gtk_label_new("High Pass Cutoff"), 0, 2, 1, 1);
937+
g_object_set(G_OBJECT(label), "halign", GTK_ALIGN_END, NULL);
938+
939+
GtkWidget *hpf = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 0, 24000, 100);
940+
w->hpf_range = GTK_RANGE(hpf);
941+
gtk_scale_add_mark(GTK_SCALE(w->hpf_range), 0, GTK_POS_BOTTOM, "Off");
942+
gtk_scale_add_mark(GTK_SCALE(w->hpf_range), FILTER_CUTOFF, GTK_POS_BOTTOM, "Default");
943+
gtk_range_set_restrict_to_fill_level(w->hpf_range, true);
944+
gtk_range_set_show_fill_level(w->hpf_range, true);
945+
gtk_range_set_value(w->hpf_range, FILTER_CUTOFF);
946+
gtk_grid_attach(grid, hpf, 1, 2, 1, 1);
947+
916948
gtk_widget_show_all(content);
917949

918950
g_signal_connect(G_OBJECT(w->device_list), "changed", G_CALLBACK(device_changed), w);
951+
g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN(w->rate_list))), "activate", G_CALLBACK(rate_entered), w);
952+
g_signal_connect(G_OBJECT(w->rate_list), "changed", G_CALLBACK(rate_changed), w);
919953
}
920954

921955
/* Set up the main window and populate with widgets */
@@ -1143,11 +1177,12 @@ static void start_interface(GApplication* app, void *p)
11431177
w->nominal_sr = 0; // Use default rate, e.g. PA_SAMPLE_RATE
11441178
w->audio_device = -1;
11451179
w->audio_rate = 0;
1180+
w->hpf_freq = FILTER_CUTOFF;
11461181

11471182
load_config(w);
11481183

11491184
w->nominal_sr = w->audio_rate;
1150-
if(start_portaudio(w->audio_device, &w->nominal_sr, &real_sr, FILTER_CUTOFF, w->is_light)) {
1185+
if(start_portaudio(w->audio_device, &w->nominal_sr, &real_sr, w->hpf_freq, w->is_light)) {
11511186
g_application_quit(app);
11521187
return;
11531188
}

‎src/tg.h‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ struct main_window {
293293
GtkWidget *audio_setup;
294294
GtkComboBox *device_list;
295295
GtkComboBox *rate_list;
296+
GtkRange *hpf_range;
296297

297298
struct output_panel *active_panel;
298299

@@ -310,6 +311,7 @@ struct main_window {
310311
int nominal_sr; // requested audio device rate
311312
int audio_device;// Selected device
312313
int audio_rate; // Selected rate
314+
int hpf_freq; // Low-pass filter cutoff frequency
313315

314316
bool vertical_layout;
315317

@@ -338,7 +340,8 @@ void error(char *format,...);
338340
OP(light_algorithm, is_light, int) \
339341
OP(vertical_paperstrip, vertical_layout, bool) \
340342
OP(audio_device, audio_device, int) \
341-
OP(audio_rate, audio_rate, int)
343+
OP(audio_rate, audio_rate, int) \
344+
OP(highpass_cutoff_freq, hpf_freq, int)
342345

343346
struct conf_data {
344347
#define DEF(NAME,PLACE,TYPE) TYPE PLACE;

0 commit comments

Comments
 (0)