From 23b507a8dbe1b12e1e8a60540ddb057cdc3da555 Mon Sep 17 00:00:00 2001 From: jait Date: Tue, 26 Aug 2008 19:04:13 +0000 Subject: [PATCH] Added settings dialog, fixed a simple leak in gst_pitch_setup_algorithm() git-svn-id: file:///svnroot/tunertool/trunk@19 4bb5ff34-d565-4b58-9699-12000fa1827a --- ChangeLog | 13 +++++++ src/gstpitch.c | 3 +- src/settings.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/settings.h | 15 ++++++++ src/tuner.c | 59 +++++++++++++++++++------------- 5 files changed, 168 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3bc5fd5..072d572 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,17 +1,28 @@ +2008-08-26 Jari Tenhunen + + * src/settings.c src/settings.h src/tuner.c: + Added settings dialog + * src/gstpitch.c (gst_pitch_setup_algorithm): + Fixed a simple leak + 2008-08-24 Jari Tenhunen + * src/tuner.c src/settings.h src/settings.c src/Makefile.am configure.ac debian/control: GConf backend for settings 2008-08-20 Jari Tenhunen + * src/tuner64.png src/tuner26.png: Slightly reworked, transparent icons 2008-08-18 Jari Tenhunen + * src/gstpitch.h src/gstpitch.c: Added Harmonic Product Spectrum algorithm and "algorithm" property. 2008-08-08 Jari Tenhunen + * src/tuner.c (main, stop_pipelines, osso_hw_state_cb, set_pipeline_states, topmost_notify): better power management: DSP will now sleep when display dims @@ -22,11 +33,13 @@ window is on foreground 2008-08-06 Jari Tenhunen + * src/tuner.c (main, window_is_active_notify): pause pipelines when the application window is inactive, should reduce energy consumption 2008-08-03 Jari Tenhunen + * src/tuner.c (key_press_event, key_release_event): renamed to button_*_event (toggle_fullscreen, key_press_event, main): diff --git a/src/gstpitch.c b/src/gstpitch.c index 0250a5a..2cce8d3 100644 --- a/src/gstpitch.c +++ b/src/gstpitch.c @@ -171,7 +171,8 @@ static void gst_pitch_setup_algorithm (GstPitch * filter) { if (filter->algorithm == GST_PITCH_ALGORITHM_HPS) { - filter->module = (gint *) g_malloc (RATE * sizeof (gint)); + if (NULL == filter->module) + filter->module = (gint *) g_malloc (RATE * sizeof (gint)); } else { if (filter->module) diff --git a/src/settings.c b/src/settings.c index 225d0b7..655626d 100644 --- a/src/settings.c +++ b/src/settings.c @@ -22,6 +22,13 @@ #include "config.h" #endif +#include +#if HILDON == 1 +#include +#include +#include +#endif + #include "settings.h" static GConfClient * client = NULL; @@ -59,7 +66,7 @@ settings_get_display_keepalive (gboolean default_value) } gboolean -settings_set_disp_keepalive (gboolean val) +settings_set_display_keepalive (gboolean val) { return gconf_client_set_bool (get_client (), GCONF_KEY_DISPLAY_KEEPALIVE, val, NULL); } @@ -123,3 +130,98 @@ settings_init (GConfClientNotifyFunc func, gpointer user_data) return TRUE; } + +#if HILDON == 1 +static void +fix_hildon_number_editor (GtkWidget * widget, gpointer data) +{ + if (GTK_IS_EDITABLE (widget)) { + gtk_editable_set_editable (GTK_EDITABLE (widget), FALSE); + g_object_set (G_OBJECT (widget), "can-focus", FALSE, NULL); + } +} + +GtkWidget * +calibration_editor_new (gint min, gint max) +{ + GtkWidget *control; + + control = hildon_number_editor_new (min, max); + /* we don't want that ugly cursor there */ + gtk_container_forall (GTK_CONTAINER (control), + (GtkCallback) fix_hildon_number_editor, NULL); + + return control; +} + +void +settings_dialog_show (GtkWindow * parent) +{ + GtkWidget *dialog; + GtkWidget *vbox; + GtkWidget *caption; + GtkSizeGroup *group; + GtkWidget *editor = NULL; + GtkWidget *control; + GtkComboBox *combo; + gint res; + + dialog = gtk_dialog_new_with_buttons("Settings", + parent, + GTK_DIALOG_MODAL | + GTK_DIALOG_DESTROY_WITH_PARENT | + GTK_DIALOG_NO_SEPARATOR, + "OK", GTK_RESPONSE_OK, + "Cancel", + GTK_RESPONSE_CANCEL, + NULL, NULL); + + g_signal_connect (G_OBJECT (dialog), "delete_event", G_CALLBACK (gtk_widget_destroy), NULL); + + vbox = gtk_vbox_new (FALSE, HILDON_MARGIN_DEFAULT); + gtk_container_set_border_width (GTK_CONTAINER (vbox), HILDON_MARGIN_DEFAULT); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox); + + group = GTK_SIZE_GROUP (gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL)); + + combo = GTK_COMBO_BOX (gtk_combo_box_new_text ()); + gtk_combo_box_append_text (combo, "Simple FFT"); + gtk_combo_box_append_text (combo, "Harmonic Product Spectrum"); + gtk_combo_box_set_active (combo, settings_get_algorithm (DEFAULT_ALGORITHM)); + caption = hildon_caption_new (group, "Pitch detection algorithm:", + GTK_WIDGET (combo), NULL, HILDON_CAPTION_OPTIONAL); + gtk_box_pack_start (GTK_BOX (vbox), caption, FALSE, FALSE, 0); +#if 0 + editor = calibration_editor_new (CALIB_MIN, CALIB_MAX); + hildon_number_editor_set_value (HILDON_NUMBER_EDITOR (editor), CALIB_DEFAULT); + caption = hildon_caption_new (group, "Calibration:", + editor, NULL, HILDON_CAPTION_OPTIONAL); + gtk_box_pack_start (GTK_BOX (vbox), caption, FALSE, FALSE, 0); +#endif + + control = gtk_check_button_new (); + caption = hildon_caption_new (group, "Keep display on:", + control, NULL, HILDON_CAPTION_OPTIONAL); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (control), + settings_get_display_keepalive (DEFAULT_DISPLAY_KEEPALIVE)); + gtk_box_pack_start (GTK_BOX (vbox), caption, FALSE, FALSE, 0); + + gtk_widget_show_all (dialog); + res = gtk_dialog_run (GTK_DIALOG (dialog)); + + if (res == GTK_RESPONSE_OK) { + /* save settings */ + g_debug ("algorithm: %d", gtk_combo_box_get_active (combo)); + settings_set_algorithm (gtk_combo_box_get_active (combo)); + if (editor) { + g_debug ("calib: %d", hildon_number_editor_get_value (HILDON_NUMBER_EDITOR (editor))); + settings_set_calibration (hildon_number_editor_get_value (HILDON_NUMBER_EDITOR (editor))); + } + g_debug ("keepalive: %d", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (control))); + settings_set_display_keepalive (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (control))); + } + + gtk_widget_destroy (dialog); +} +#endif + diff --git a/src/settings.h b/src/settings.h index 11ba480..b66c3c3 100644 --- a/src/settings.h +++ b/src/settings.h @@ -21,6 +21,7 @@ #ifndef __SETTINGS_H__ #define __SETTINGS_H__ +#include #include #define GCONF_ROOT "/apps/tuner" @@ -28,11 +29,25 @@ #define GCONF_KEY_CALIBRATION GCONF_ROOT "/calibration" #define GCONF_KEY_DISPLAY_KEEPALIVE GCONF_ROOT "/display_keepalive" +#define DEFAULT_ALGORITHM (0) /* GST_PITCH_ALGORITHM_FFT */ +#define DEFAULT_DISPLAY_KEEPALIVE TRUE + +enum +{ + CALIB_MIN = 430, + CALIB_MAX = 450, + CALIB_DEFAULT = 440 +}; + gint settings_get_algorithm (gint default_value); gint settings_get_calibration (gint default_value); gboolean settings_set_calibration (gint value); gboolean settings_get_display_keepalive (gboolean default_value); gboolean settings_init (GConfClientNotifyFunc func, gpointer user_data); +#if HILDON == 1 +void settings_dialog_show (GtkWindow * parent); +GtkWidget * calibration_editor_new (gint min, gint max); +#endif #endif /* __SETTINGS_H__ */ diff --git a/src/tuner.c b/src/tuner.c index 987d2a6..4679b7c 100644 --- a/src/tuner.c +++ b/src/tuner.c @@ -103,12 +103,7 @@ enum NUM_NOTES = 96 }; -enum -{ - CALIB_MIN = 430, - CALIB_MAX = 450, - CALIB_DEFAULT = 440 -}; + #define NUM_LEDS (66) #define NUM_WKEYS (15) /* # of white keys in the piano keyboard */ @@ -228,17 +223,6 @@ recalculate_scale (double a4) } } -#ifdef HILDON -static void -fix_hildon_number_editor (GtkWidget * widget, gpointer data) -{ - if (GTK_IS_EDITABLE (widget)) { - gtk_editable_set_editable (GTK_EDITABLE (widget), FALSE); - g_object_set (G_OBJECT (widget), "can-focus", FALSE, NULL); - } -} -#endif - static void calibration_changed (GObject * object, GParamSpec * pspec, gpointer user_data) { @@ -641,6 +625,18 @@ settings_notify (GConfClient * client, guint cnxn_id, GConfEntry * entry, gpoint } } +static void +settings_activate (GtkWidget * widget, GtkWidget * main_win) +{ + settings_dialog_show (GTK_WINDOW (main_win)); +} + +static void +close_activate (GtkWidget * widget, gpointer data) +{ + gtk_main_quit (); +} + int main (int argc, char *argv[]) { @@ -668,6 +664,8 @@ main (int argc, char *argv[]) GtkWidget *alignment; GtkWidget *calibrate; GtkWidget *sep; + GtkWidget *menu; + GtkWidget *menuitem; #ifndef HILDON GdkPixbuf *icon = NULL; @@ -728,6 +726,22 @@ main (int argc, char *argv[]) view = HILDON_WINDOW (hildon_window_new ()); mainWin = GTK_WIDGET (view); g_signal_connect (G_OBJECT (app), "notify::is-topmost", G_CALLBACK (topmost_notify), appdata); + + menu = gtk_menu_new (); + hildon_window_set_menu (HILDON_WINDOW (view), GTK_MENU (menu)); + + menuitem = gtk_menu_item_new_with_label ("Settings..."); + gtk_menu_append (GTK_MENU (menu), menuitem); + g_signal_connect (G_OBJECT (menuitem), "activate", + GTK_SIGNAL_FUNC (settings_activate), mainWin); + + menuitem = gtk_menu_item_new_with_label ("Close"); + gtk_menu_append (GTK_MENU (menu), menuitem); + g_signal_connect (G_OBJECT (menuitem), "activate", + GTK_SIGNAL_FUNC (close_activate), mainWin); + + gtk_widget_show_all (menu); + #endif #else mainWin = gtk_window_new (GTK_WINDOW_TOPLEVEL); @@ -749,7 +763,7 @@ main (int argc, char *argv[]) g_object_set (G_OBJECT (appdata->pitch), "message", TRUE, "minfreq", 10, "maxfreq", 4000, - "algorithm", settings_get_algorithm (GST_PITCH_ALGORITHM_FFT), + "algorithm", settings_get_algorithm (DEFAULT_ALGORITHM), NULL); sink1 = gst_element_factory_make ("fakesink", "sink1"); @@ -785,7 +799,7 @@ main (int argc, char *argv[]) g_signal_connect (G_OBJECT (mainWin), "destroy", G_CALLBACK (on_window_destroy), NULL); g_signal_connect (G_OBJECT(mainWin), "key_press_event", - G_CALLBACK(key_press_event), mainWin); + G_CALLBACK (key_press_event), mainWin); /* Note label */ appdata->targetFrequency = gtk_label_new (""); @@ -807,12 +821,9 @@ main (int argc, char *argv[]) gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 5); #ifdef HILDON - calibrate = hildon_number_editor_new (CALIB_MIN, CALIB_MAX); + calibrate = calibration_editor_new (CALIB_MIN, CALIB_MAX); hildon_number_editor_set_value (HILDON_NUMBER_EDITOR (calibrate), calib); - /* we don't want that ugly cursor there */ - gtk_container_forall (GTK_CONTAINER (calibrate), - (GtkCallback) fix_hildon_number_editor, NULL); g_signal_connect (G_OBJECT (calibrate), "notify::value", G_CALLBACK (calibration_changed), NULL); #else @@ -871,7 +882,7 @@ main (int argc, char *argv[]) #endif #if HILDON == 1 - appdata->display_keepalive = settings_get_display_keepalive (TRUE); + appdata->display_keepalive = settings_get_display_keepalive (DEFAULT_DISPLAY_KEEPALIVE); if (appdata->display_keepalive) display_keepalive (appdata); -- 1.7.9.5