@@ -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+
615630static 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 }
0 commit comments