1/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2
3using GLib;
4using Gtk;
5
6public class Main : Object
7{
8	/*
9	 * Uncomment this line when you are done testing and building a tarball
10	 * or installing
11	 */
12	//const string UI_FILE = Config.PACKAGE_DATA_DIR + "/" + "guitar_tuner.ui";
13	const string UI_FILE = "src/guitar_tuner.ui";
14
15	Gst.Element sink;
16	Gst.Element source;
17	Gst.Pipeline pipeline;
18
19	[CCode (instance_pos=-1)]
20	public void on_button_clicked (Gtk.Button sender) {
21		var label = sender.get_child () as Gtk.Label;
22		switch (label.get_label()) {
23			case "E":
24				play_sound (329.63);
25				break;
26			case "A":
27				play_sound (440);
28				break;
29			case "D":
30				play_sound (587.33);
31				break;
32			case "G":
33				play_sound (783.99);
34				break;
35			case "B":
36				play_sound (987.77);
37				break;
38			case "e":
39				play_sound (1318);
40				break;
41			default:
42				break;
43		}
44	}
45
46	public Main () {
47		try
48		{
49			var builder = new Builder ();
50			builder.add_from_file (UI_FILE);
51			builder.connect_signals (this);
52
53			var window = builder.get_object ("window") as Window;
54			window.show_all ();
55		}
56		catch (Error e) {
57			stderr.printf ("Could not load UI: %s\n", e.message);
58		}
59	}
60
61	[CCode (instance_pos = -1)]
62	public void on_destroy (Window window) {
63		Gtk.main_quit();
64	}
65
66	private void play_sound(double frequency) {
67		pipeline = new Gst.Pipeline ("note");
68		source   = Gst.ElementFactory.make ("audiotestsrc",
69		                                     "source");
70		sink     = Gst.ElementFactory.make ("autoaudiosink",
71		                                     "output");
72
73		/* set frequency */
74		source.set ("freq", frequency);
75
76		pipeline.add (source);
77		pipeline.add (sink);
78		source.link (sink);
79
80		pipeline.set_state (Gst.State.PLAYING);
81
82		/* stop it after 200ms */
83	    var time = new TimeoutSource(200);
84
85		time.set_callback(() => {
86			pipeline.set_state (Gst.State.NULL);
87		    return false;
88		});
89
90		time.attach(null);
91	}
92
93	static int main (string[] args) {
94		Gst.init (ref args);
95		Gtk.init (ref args);
96		var app = new Main ();
97
98		Gtk.main ();
99
100		return 0;
101	}
102}
103