Update single word
[sgc.git] / singleword / praat.c
blob6b12dce15fe462d07f52f7844ff7322aac0c0ffc
1 #include "singleword.h"
3 #include "melder.h"
4 #include "NUMmachar.h"
5 #include "gsl_errno.h"
7 #include "site.h"
8 #include "machine.h"
9 #include "Strings.h"
10 #include "Sound.h"
11 #include "Vector.h"
12 #include "Thing.h"
13 #include "Pitch_to_Sound.h"
14 #include "Data.h"
16 gboolean setButtonsTrue() {
18 gchar *feedbackTXT;
19 gchar *contents;
20 gboolean setButton = TRUE;
21 GtkWidget *buttonRecord = glade_xml_get_widget(xml, "buttonRecord");
22 GtkWidget *buttonPlay = glade_xml_get_widget(xml, "buttonPlay");
23 GtkWidget *buttonHum = glade_xml_get_widget(xml, "buttonHum");
24 GtkWidget *drawingareaPitch = glade_xml_get_widget(xml, "drawingareaPitch");
25 gchar *path = g_build_filename(RECORDPATH, "singleword.wav", NULL);
26 if (g_access(path, F_OK) == -1) setButton = FALSE;
27 g_free(path);
28 gtk_widget_set_sensitive(buttonPlay, setButton);
29 gtk_widget_set_sensitive(buttonRecord, TRUE);
30 gtk_widget_set_sensitive(buttonHum, TRUE);
33 gtk_widget_queue_draw(drawingareaPitch);
35 feedbackTXT = g_build_filename(SCRIPTPATH, G_DIR_SEPARATOR_S, "feedback.txt", NULL);
37 if (g_file_get_contents(feedbackTXT, &contents, NULL, NULL) == TRUE) {
38 GtkWidget *label = glade_xml_get_widget(xml, "labelFeedback");
39 gtk_label_set_text(GTK_LABEL(label), contents);
40 g_unlink(feedbackTXT);
42 g_free(feedbackTXT);
44 return FALSE;
47 gboolean setButtonsFalse() {
48 GtkWidget *buttonRecord = glade_xml_get_widget(xml, "buttonRecord");
49 GtkWidget *buttonPlay = glade_xml_get_widget(xml, "buttonPlay");
50 GtkWidget *buttonHum = glade_xml_get_widget(xml, "buttonHum");
52 gtk_widget_set_sensitive(buttonRecord, FALSE);
53 gtk_widget_set_sensitive(buttonPlay, FALSE);
54 gtk_widget_set_sensitive(buttonHum, FALSE);
55 return FALSE;
58 gpointer sound_init(void *args)
60 Sound melderSoundFromMic;
61 #ifndef PRAATEXTERNAL
62 gchar *argv[2] = { "Praat", "niets" };
63 praat_init("Praat", 2, argv);
64 praat_uvafon_init();
65 #endif
67 // Melder_setMaximumAsynchronicity (Melder_SYNCHRONOUS);
69 melderSoundFromMic = Sound_recordFixedTime (1, 1.0, 0.5, 44100, 1.0);
70 forget(melderSoundFromMic);
71 Melder_clearError();
72 g_idle_add(setButtonsTrue, NULL);
73 g_thread_exit(NULL);
74 return NULL;
77 static void playInPraat(gchar *path) {
78 if (g_access(path, F_OK) == 0) {
79 structMelderFile file;
80 Sound melderSoundFromFile;
81 Melder_pathToFile(Melder_peekUtf8ToWcs(path), & file);
82 melderSoundFromFile = Sound_readFromSoundFile (& file);
83 if (! melderSoundFromFile) {
84 g_warning(_("Praat cannot open the file!"));
85 } else {
86 Sound_play(melderSoundFromFile, NULL, NULL);
87 forget(melderSoundFromFile);
89 } else {
90 g_warning(_("The file %s just doesn't exist!"), path);
92 Melder_clearError();
95 gpointer playHum(void *args) {
96 if (active != NULL) {
97 GString *filename = g_string_sized_new (200);
98 g_string_printf(filename, "%s%s%s-%0.f.wav", PITCHPATH, G_DIR_SEPARATOR_S, active, upperRegister);
99 g_idle_add(setButtonsFalse, NULL);
100 playInPraat(filename->str);
101 g_string_free(filename, TRUE);
102 g_idle_add(setButtonsTrue, NULL);
104 g_thread_exit(NULL);
105 return NULL;
109 gpointer play(void *args) {
110 gchar *path = g_build_filename(RECORDPATH, "singleword.wav", NULL);
111 g_idle_add(setButtonsFalse, NULL);
112 playInPraat(path);
113 g_free(path);
114 g_idle_add(setButtonsTrue, NULL);
115 g_thread_exit(NULL);
116 return NULL;
119 gpointer record(void *args) {
120 if (active != NULL) {
121 g_idle_add(setButtonsFalse, NULL);
122 if (g_access(RECORDPATH, F_OK) == 0) {
123 Sound melderSoundFromMic = Sound_recordFixedTime (1, 1.0, 0.5, 44100, RECORDTIME);
124 if (! melderSoundFromMic) {
125 g_warning(_("No sound from praat!"));
126 } else {
127 GString *cmd = g_string_sized_new(128);
128 gchar *path;
129 structMelderFile file;
131 path = g_build_filename(RECORDPATH, "singleword.wav", NULL);
134 Vector_scale(melderSoundFromMic, 0.99);
135 Melder_pathToFile(Melder_peekUtf8ToWcs(path), &file);
136 Sound_writeToAudioFile16 (melderSoundFromMic, &file, Melder_WAV);
137 forget(melderSoundFromMic);
139 g_chdir(SCRIPTPATH);
140 #ifdef PRAATEXTERNAL
141 g_string_printf(cmd, "%s SGC_ToneProt.praat ..%s%s %s %0.f 3 none 0", PRAATBIN, G_DIR_SEPARATOR_S, path, active, upperRegister);
142 system(cmd->str);
143 #else
144 g_string_printf(cmd, "SGC_ToneProt.praat ..%s%s %s %0.f 3 none 0", G_DIR_SEPARATOR_S, path, active, upperRegister);
145 praat_executeScriptFromFileNameWithArguments(cmd->str);
146 Melder_clearError();
147 #endif
149 g_free(path);
150 g_chdir("..");
151 g_string_free(cmd, TRUE);
153 } else {
154 g_warning(_("Missing recording directory %s."), RECORDPATH);
156 Melder_clearError();
157 g_idle_add(setButtonsTrue, NULL);
159 g_thread_exit(NULL);
160 return NULL;