+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):
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)
#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;
}
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);
}
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
+
#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__ */
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 */
}
}
-#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)
{
}
}
+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[])
{
GtkWidget *alignment;
GtkWidget *calibrate;
GtkWidget *sep;
+ GtkWidget *menu;
+ GtkWidget *menuitem;
#ifndef HILDON
GdkPixbuf *icon = NULL;
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);
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");
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 ("");
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
#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);