Label troep
[sgc.git] / signals.c
blob7966cfee17bcb588d8832cb779b0cefbed9aca6a
1 #include "sgc.h"
2 #include "signals.h"
4 gdouble upperRegister = 200.0;
6 gchar * voicepath(gchar *string) {
7 gchar *path = g_strjoin(NULL, base, G_DIR_SEPARATOR_S, string, ".wav", NULL);
8 if (g_access(path, F_OK) != 0) {
9 g_free(path);
10 path = g_strjoin(NULL, PINYINPATH, G_DIR_SEPARATOR_S, string, ".wav", NULL);
12 return path;
15 static void setButtonByFileExists(GtkWidget *button, gchar *path) {
16 if (g_access(path, F_OK) == 0) {
17 gtk_widget_set_sensitive(button, TRUE);
18 } else {
19 gtk_widget_set_sensitive(button, FALSE);
24 static void setButtonExample() {
25 GtkWidget *buttonExample = glade_xml_get_widget(xml, "buttonExample");
26 if (treevalid) {
27 GtkWidget *gimiHum = glade_xml_get_widget(xml, "checkmenuitemExampleHum");
28 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(gimiHum))) {
29 gchar *string;
30 gchar *path;
32 gtk_tree_model_get(GTK_TREE_MODEL(liststore), &mainIter, COL_TEXT, &string, -1);
33 path = voicepath(string);
35 setButtonByFileExists(buttonExample, path);
37 g_free(path);
38 g_free(string);
39 } else {
40 gtk_widget_set_sensitive(buttonExample, TRUE);
42 } else {
43 gtk_widget_set_sensitive(buttonExample, FALSE);
47 static void setButtonPlay() {
48 GtkWidget *buttonPlay = glade_xml_get_widget(xml, "buttonPlay");
49 gchar *path = g_build_filename(SCRIPTPATH, "lastExample.wav", NULL);
50 setButtonByFileExists(buttonPlay, path);
51 g_free(path);
55 gboolean setButtonsTrue() {
56 GtkWidget *buttonRecord = glade_xml_get_widget(xml, "buttonRecord");
58 GtkWidget *drawingareaPitch = glade_xml_get_widget(xml, "drawingareaPitch");
59 gchar *feedbackTXT;
60 gchar *contents;
63 gtk_widget_set_sensitive(buttonRecord, TRUE);
64 setButtonPlay();
65 setButtonExample();
67 gtk_widget_queue_draw(drawingareaPitch);
69 feedbackTXT = g_build_filename(SCRIPTPATH, G_DIR_SEPARATOR_S, "feedback.txt", NULL);
71 if (g_file_get_contents(feedbackTXT, &contents, NULL, NULL) == TRUE) {
72 // g_debug("Sets label!\n");
73 GtkWidget *label = glade_xml_get_widget(xml, "labelFeedback");
74 gtk_label_set_text(GTK_LABEL(label), contents);
75 // g_debug("Label set!\n");
76 g_unlink(feedbackTXT);
78 g_free(feedbackTXT);
80 return FALSE;
83 gboolean setButtonsFalse() {
84 GtkWidget *buttonRecord = glade_xml_get_widget(xml, "buttonRecord");
85 GtkWidget *buttonPlay = glade_xml_get_widget(xml, "buttonPlay");
86 GtkWidget *buttonExample = glade_xml_get_widget(xml, "buttonExample");
87 // g_debug("%s welcome!\n", __func__);
89 gtk_widget_set_sensitive(buttonRecord, FALSE);
90 gtk_widget_set_sensitive(buttonPlay, FALSE);
91 gtk_widget_set_sensitive(buttonExample, FALSE);
93 // g_debug("%s bye!\n", __func__);
95 return FALSE;
98 void on_buttonRecord_clicked(GtkWidget *widget, gpointer user_data) {
99 if (treevalid) {
100 gchar *string;
101 gtk_tree_model_get(GTK_TREE_MODEL(liststore), &mainIter, COL_TEXT, &string, -1);
104 if (string == NULL) {
105 GtkWidget *dialog = gtk_message_dialog_new(NULL,
106 GTK_DIALOG_MODAL,
107 GTK_MESSAGE_WARNING,
108 GTK_BUTTONS_OK,
109 _("Don't have any (more) tests"));
110 gtk_dialog_run (GTK_DIALOG (dialog));
111 gtk_widget_destroy (dialog);
112 /* Nothing to do? */
113 } else {
114 /* Start record Thread */
116 // g_debug("%s creates record", __func__);
118 g_thread_create((GThreadFunc)record, NULL, FALSE, NULL);
120 // g_debug("%s is done", __func__);
121 g_free(string);
126 void on_buttonExample_clicked(GtkWidget *widget, gpointer user_data) {
127 /* Play Thread */
128 /* Start example Thread */
129 g_thread_create((GThreadFunc)example, widget, FALSE, NULL);
132 void on_buttonPlay_clicked(GtkWidget *widget, gpointer user_data) {
133 /* Play Thread */
134 /* Start play Thread */
135 g_thread_create((GThreadFunc)play, widget, FALSE, NULL);
138 gboolean prev(GtkWidget *previous) {
139 gboolean ret = FALSE;
140 if (treevalid) {
141 /* Code From anchient Sylpheed */
142 GtkTreePath *path;
143 GtkTreeIter prev;
145 path = gtk_tree_model_get_path(GTK_TREE_MODEL(liststore), &mainIter);
147 if ((ret = gtk_tree_path_prev(path)) == TRUE) {
148 gtk_tree_model_get_iter(GTK_TREE_MODEL(liststore), &prev, path);
149 if (previous != NULL) {
150 mainIter = prev;
155 gtk_tree_path_free(path);
159 return ret;
162 gboolean next(GtkWidget *next) {
163 if (treevalid) {
164 if (next != NULL) {
165 return gtk_tree_model_iter_next(GTK_TREE_MODEL(liststore), &mainIter);
166 } else {
167 GtkTreeIter next = mainIter;
168 return gtk_tree_model_iter_next(GTK_TREE_MODEL(liststore), &next);
170 } else {
171 return FALSE;
175 void updateWidgets() {
176 GtkWidget *labelFeedback = glade_xml_get_widget(xml, "labelFeedback");
178 if (treevalid) {
179 gchar *string;
180 gtk_tree_model_get(GTK_TREE_MODEL(liststore), &mainIter, COL_TEXT, &string, -1);
181 GString *label = g_string_new(string);
182 g_string_prepend(label, "<span size=\"xx-large\">");
183 g_string_append(label, "</span>");
184 gtk_label_set_markup(GTK_LABEL(labelFeedback), label->str);
185 g_string_free(label, TRUE);
187 g_free(string);
188 } else {
189 gtk_label_set_markup(GTK_LABEL(labelFeedback), "");
192 gtk_widget_set_sensitive(glade_xml_get_widget(xml, "buttonRecord"), treevalid);
193 gtk_widget_set_sensitive(glade_xml_get_widget(xml, "imagemenuitemSave"), treevalid);
194 gtk_widget_set_sensitive(glade_xml_get_widget(xml, "imagemenuitemSaveAs"), treevalid);
196 gtk_widget_set_sensitive(glade_xml_get_widget(xml, "buttonPrevious"), prev(NULL));
197 gtk_widget_set_sensitive(glade_xml_get_widget(xml, "buttonNext"), next(NULL));
199 setButtonPlay();
200 setButtonExample();
202 gtk_widget_queue_draw(glade_xml_get_widget(xml, "drawingareaPitch"));
205 void on_Save(GtkWidget *chooser, gpointer user_data) {
206 fileSave(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)));
209 void on_dialogAdd_close(GtkWidget *button, gpointer user_data) {
210 GtkWidget *buttonAdd = glade_xml_get_widget(xml, "buttonAdd");
211 gtk_widget_hide(gtk_widget_get_toplevel(button));
212 gtk_widget_grab_focus(buttonAdd);
215 void on_menuitemVoice_activate(GtkWidget *widget, gpointer user_data) {
216 const gchar *name = gtk_widget_get_name(widget);
217 GtkWidget *drawingareaPitch = glade_xml_get_widget(xml, "drawingareaPitch");
218 if (g_str_equal(name, "menuitemVoice_Male_Low") == TRUE) upperRegister = 150.0;
219 if (g_str_equal(name, "menuitemVoice_Male") == TRUE) upperRegister = 200.0;
220 if (g_str_equal(name, "menuitemVoice_Female") == TRUE) upperRegister = 300.0;
221 if (g_str_equal(name, "menuitemVoice_Child") == TRUE) upperRegister = 450.0;
222 gtk_widget_queue_draw(drawingareaPitch);
225 void paint (GtkWidget *widget, GdkEventExpose *eev, gpointer data) {
226 if (treevalid) {
227 gchar *string;
228 gtk_tree_model_get(GTK_TREE_MODEL(liststore), &mainIter, COL_TEXT, &string, -1);
230 if (string != NULL) {
231 cairo_t *cr;
232 GString *filename = g_string_sized_new (200);
233 GString *cmd = g_string_sized_new (200);
234 GString *recordedPT = g_string_sized_new(100);
236 #ifdef PITCHTIER
237 g_string_printf(filename, "%s%s%s-%0.f.PitchTier", PITCHPATH, G_DIR_SEPARATOR_S, string, upperRegister);
238 g_string_printf(recordedPT, "%s%s%s.PitchTier", RECORDPATH, G_DIR_SEPARATOR_S, string);
239 #else
240 g_string_printf(filename, "%s%s%s-%0.f.Pitch", PITCHPATH, G_DIR_SEPARATOR_S, string, upperRegister);
241 g_string_printf(recordedPT, "%s%s%s.Pitch", RECORDPATH, G_DIR_SEPARATOR_S, string);
242 #endif
244 if (g_access(filename->str, F_OK) == -1) {
245 /* Eigenlijk wil je de system ranzigheid vervangen door een werkende versie van dit,
246 * maar eigenlijk MOET je gewoon de praat scripts naar C omzetten ;)
247 * gint exit_status;
248 GError *err = NULL;
249 gchar *argv[4];
250 gchar *upper = g_malloc(5);
251 g_ascii_dtostr(upper, 5, upperRegister);
252 argv[0] = NULL;
253 argv[1] = testList[intTestCounter];
254 argv[2] = upper;
255 argv[3] = NULL;
257 g_spawn_sync((const gchar *) SCRIPTPATH, argv, NULL, (GSpawnFlags)(G_SPAWN_SEARCH_PATH | G_SPAWN_FILE_AND_ARGV_ZERO), NULL, NULL, NULL, NULL, &exit_status, &err);*/
258 g_chdir(SCRIPTPATH);
259 g_string_printf(cmd, "%s DrawToneContour.praat %s %0.f", PRAATBIN, string, upperRegister);
260 // g_debug("%s", cmd->str);
261 system(cmd->str);
262 g_chdir("..");
265 cr = gdk_cairo_create (widget->window);
266 cairo_set_line_width (cr, 1);
267 cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
268 CAIRO_FONT_WEIGHT_BOLD);
271 if (g_access(filename->str, F_OK) == 0) {
272 cairo_move_to (cr, 5, 15);
273 cairo_set_source_rgb (cr, 0,0,0);
274 cairo_show_text (cr, _("Reference Pitch"));
277 drawPitchTier(cr, filename->str,
278 widget->allocation.width,
279 widget->allocation.height, upperRegister + 100.0);
282 // g_debug("%s", recordedPT->str);
284 if (g_access(recordedPT->str, F_OK) == 0) {
285 cairo_move_to (cr, 15, 30);
286 cairo_set_source_rgb (cr, 1,0,0);
287 cairo_show_text (cr, _("Your Pitch"));
289 drawPitchTier(cr, recordedPT->str,
290 widget->allocation.width,
291 widget->allocation.height, upperRegister + 100.0);
294 g_string_free(recordedPT, TRUE);
295 cairo_destroy (cr);
296 g_string_free(filename, TRUE);
298 g_free(string);
302 void on_menuitemShuffle_activate(GtkWidget *menuitem, gpointer data) {
303 int i;
304 GtkTreeIter a, b;
305 gint amount = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(liststore), NULL) - 1;
306 if (amount > 0) {
307 for (i = 0; i <= amount; i++) {
308 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(liststore),
309 &a, NULL,
310 g_random_int_range(0, amount));
311 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(liststore),
312 &b, NULL,
313 g_random_int_range(0, amount));
314 gtk_list_store_swap(GTK_LIST_STORE(liststore), &a, &b);
316 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(liststore), &mainIter);
317 updateWidgets();