Added settings dialog, fixed a simple leak in gst_pitch_setup_algorithm()
authorjait <jari.tenhunen@iki.fi>
Tue, 26 Aug 2008 19:04:13 +0000 (19:04 +0000)
committerjait <jari.tenhunen@iki.fi>
Tue, 26 Aug 2008 19:04:13 +0000 (19:04 +0000)
git-svn-id: file:///svnroot/tunertool/trunk@19 4bb5ff34-d565-4b58-9699-12000fa1827a

ChangeLog
src/gstpitch.c
src/settings.c
src/settings.h
src/tuner.c

index 3bc5fd5..072d572 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,17 +1,28 @@
+2008-08-26  Jari Tenhunen  <jari.tenhunen@iki.fi>
+
+       * 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  <jari.tenhunen@iki.fi>
+
        * 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  <jari.tenhunen@iki.fi>
+
        * src/tuner64.png src/tuner26.png:
        Slightly reworked, transparent icons
 
 2008-08-18  Jari Tenhunen  <jari.tenhunen@iki.fi>
+
        * src/gstpitch.h src/gstpitch.c:
        Added Harmonic Product Spectrum algorithm and "algorithm" property.
 
 2008-08-08  Jari Tenhunen  <jari.tenhunen@iki.fi>
+
        * 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 
        window is on foreground
 
 2008-08-06  Jari Tenhunen  <jari.tenhunen@iki.fi>
+
        * 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  <jari.tenhunen@iki.fi>
+
        * src/tuner.c (key_press_event, key_release_event):
        renamed to button_*_event
        (toggle_fullscreen, key_press_event, main):
index 0250a5a..2cce8d3 100644 (file)
@@ -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) 
index 225d0b7..655626d 100644 (file)
 #include "config.h"
 #endif
 
+#include <gtk/gtk.h>
+#if HILDON == 1
+#include <hildon/hildon-caption.h>
+#include <hildon/hildon-defines.h>
+#include <hildon/hildon-number-editor.h>
+#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
+
index 11ba480..b66c3c3 100644 (file)
@@ -21,6 +21,7 @@
 #ifndef __SETTINGS_H__
 #define __SETTINGS_H__
 
+#include <gtk/gtkwindow.h>
 #include <gconf/gconf-client.h>
 
 #define GCONF_ROOT "/apps/tuner"
 #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__ */
 
index 987d2a6..4679b7c 100644 (file)
@@ -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);