Blame platform-demos/C/guitar-tuner/guitar-tuner.c

Packit 1470ea
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
Packit 1470ea
Packit 1470ea
#include <config.h>
Packit 1470ea
#include <gtk/gtk.h>
Packit 1470ea
#include <gst/gst.h>
Packit 1470ea
#include <glib/gi18n.h>
Packit 1470ea
Packit 1470ea
/* For testing purposes, use the local (not installed) ui file */
Packit 1470ea
/* #define UI_FILE PACKAGE_DATA_DIR"/guitar_tuner/ui/guitar_tuner.ui" */
Packit 1470ea
#define UI_FILE "src/guitar_tuner.ui"
Packit 1470ea
Packit 1470ea
/* Frequencies of the tones */
Packit 1470ea
#define NOTE_E 329.63
Packit 1470ea
#define NOTE_A 440
Packit 1470ea
#define NOTE_D 587.33
Packit 1470ea
#define NOTE_G 783.99
Packit 1470ea
#define NOTE_B 987.77
Packit 1470ea
#define NOTE_e 1318.5
Packit 1470ea
Packit 1470ea
#define LENGTH 500
Packit 1470ea
Packit 1470ea
#define WIDGET_WINDOW "window"
Packit 1470ea
Packit 1470ea
static gboolean
Packit 1470ea
pipeline_stop (GstElement* pipeline)
Packit 1470ea
{
Packit 1470ea
	gst_element_set_state (pipeline, GST_STATE_NULL);
Packit 1470ea
	g_object_unref (pipeline);
Packit 1470ea
Packit 1470ea
	/* disconnect handler */
Packit 1470ea
	return FALSE;
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
static void 
Packit 1470ea
play_sound (gdouble frequency)
Packit 1470ea
{
Packit 1470ea
	GstElement *source, *sink;
Packit 1470ea
	GstElement *pipeline;
Packit 1470ea
Packit 1470ea
	pipeline = gst_pipeline_new ("note");
Packit 1470ea
	source   = gst_element_factory_make ("audiotestsrc",
Packit 1470ea
	                                     "source");
Packit 1470ea
	sink     = gst_element_factory_make ("autoaudiosink",
Packit 1470ea
	                                     "output");
Packit 1470ea
Packit 1470ea
	/* set frequency */
Packit 1470ea
	g_object_set (source, "freq", frequency, NULL);
Packit 1470ea
	
Packit 1470ea
	gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
Packit 1470ea
	gst_element_link (source, sink);
Packit 1470ea
Packit 1470ea
	gst_element_set_state (pipeline, GST_STATE_PLAYING);
Packit 1470ea
Packit 1470ea
	/* stop it after 500ms */
Packit 1470ea
	g_timeout_add (LENGTH, (GSourceFunc) pipeline_stop, pipeline);
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
/* Callback for the buttons */
Packit 1470ea
void on_button_clicked (GtkButton* button,
Packit 1470ea
                        gpointer user_data)
Packit 1470ea
{
Packit 1470ea
	const gchar* text = gtk_button_get_label (button);
Packit 1470ea
Packit 1470ea
	if (g_str_equal (text, _("E")))
Packit 1470ea
	    play_sound (NOTE_E);
Packit 1470ea
	else if (g_str_equal (text, _("A")))
Packit 1470ea
	    play_sound (NOTE_A);
Packit 1470ea
	else if (g_str_equal (text, _("G")))
Packit 1470ea
	    play_sound (NOTE_G);
Packit 1470ea
	else if (g_str_equal (text, _("D")))
Packit 1470ea
	    play_sound (NOTE_D);
Packit 1470ea
	else if (g_str_equal (text, _("B")))
Packit 1470ea
	    play_sound (NOTE_B);
Packit 1470ea
	else if (g_str_equal (text, _("e")))
Packit 1470ea
	    play_sound (NOTE_e);
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
int
Packit 1470ea
main (int argc, char *argv[])
Packit 1470ea
{
Packit 1470ea
 	GtkWidget *window;
Packit 1470ea
	GtkBuilder *builder;
Packit 1470ea
Packit 1470ea
	/* Initialize gtk+ and gstreamer */
Packit 1470ea
	gst_init (&argc, &argv);
Packit 1470ea
	gtk_init (&argc, &argv);
Packit 1470ea
Packit 1470ea
	builder = gtk_builder_new ();
Packit 1470ea
	gtk_builder_add_from_file (builder, UI_FILE, NULL);
Packit 1470ea
Packit 1470ea
	window = GTK_WIDGET (gtk_builder_get_object (builder, WIDGET_WINDOW));
Packit 1470ea
	gtk_builder_connect_signals (builder, NULL);
Packit 1470ea
	
Packit 1470ea
	gtk_widget_show (window);
Packit 1470ea
Packit 1470ea
	gtk_main ();
Packit 1470ea
	return 0;
Packit 1470ea
}