1 #include "gcin.h"
2 #include "pho.h"
3 extern gboolean test_mode;
4 void load_tab_pho_file();
5
6 #if UNIX
7 #include <signal.h>
8 gboolean test_mode;
9
pho_play(phokey_t key)10 int pho_play(phokey_t key)
11 {
12 if (!phonetic_speak)
13 return 0;
14
15 static char ogg123[]="/usr/bin/ogg123";
16 if (access(ogg123, R_OK)) {
17 box_warn("gcin speech needs 'ogg123' in 'vorbis-tools'");
18 exit(1);
19 }
20
21 if (access(GCIN_OGG_DIR, R_OK)) {
22 box_warn("You have to install the speech data:'ogg.tgz'");
23 exit(1);
24 }
25
26 static int pid;
27 static time_t last_time;
28 time_t t = time(NULL);
29 if (!gcin_sound_play_overlap) {
30 if (pid && t - last_time < 2)
31 kill(pid, 9);
32 }
33 char *ph = phokey_to_str2(key, 1);
34
35 static char tt[128];
36 sprintf(tt, GCIN_OGG_DIR"/%s/%s", ph, phonetic_speak_sel);
37 last_time = t;
38
39 if (pid = fork()) {
40 if (pid < 0)
41 dbg("cannot fork ?");
42 return 1;
43 }
44
45 #if 0
46 close(1);
47 close(2);
48 #endif
49
50 execl(ogg123, "ogg123", tt, NULL);
51 exit(1);
52 }
53 #else
54 extern "C" {
55 HANDLE play_ogg_file(wchar_t *file_name);
56 };
57
58 void ErrorExit(LPTSTR lpszFunction);
pho_play(phokey_t key)59 void pho_play(phokey_t key)
60 {
61 if (!phonetic_speak || test_mode)
62 return;
63
64 #if 0
65 static PROCESS_INFORMATION procinfo;
66 static time_t last_time;
67 time_t t = time(NULL);
68 #if 0
69 // the result is bad on windows
70 if (!gcin_sound_play_overlap) {
71 if (procinfo.hProcess && t - last_time < 2)
72 TerminateProcess(procinfo.hProcess, 0);
73 }
74 #endif
75 char *ph = phokey_to_str2(key, 1);
76 char tt[512];
77
78 last_time = t;
79 if (procinfo.hProcess) {
80 CloseHandle(procinfo.hProcess);
81 CloseHandle(procinfo.hThread);
82 }
83
84 sprintf(tt, "\"%s\\bin\\oggdec.exe\" -p \"%s\\ogg\\%s\\%s\"", gcin_program_files_path, gcin_program_files_path, ph, phonetic_speak_sel);
85 wchar_t tt16[MAX_PATH*2];
86
87 utf8_to_16(tt, tt16, sizeof(tt16));
88 #if 0
89 char pro[64];
90 wchar_t pro16[64];
91 strcpy(pro, gcin_program_files_path);
92 strcat(pro, "\\oggdec.exe");
93 utf8_to_16(pro, pro16, ARRAYSIZE(tt16));
94 #endif
95 STARTUPINFOW si;
96 // PROCESS_INFORMATION pi;
97
98 ZeroMemory( &si, sizeof(si) );
99 si.cb = sizeof(si);
100 ZeroMemory( &procinfo, sizeof(procinfo));
101
102 if(!CreateProcessW(NULL, tt16, NULL,NULL,FALSE, CREATE_NO_WINDOW, NULL,NULL, &si, &procinfo)) {
103 #if _DEBUG
104 ErrorExit("CreateProcessW");
105 dbg("cannot exec %s\n", tt);
106 #endif
107 }
108 #else
109 char *ph = phokey_to_str2(key, 1);
110 char tt[512];
111 sprintf(tt, "%s\\ogg\\%s\\%s", gcin_program_files_path, ph, phonetic_speak_sel);
112 wchar_t tt16[MAX_PATH];
113 utf8_to_16(tt, tt16, ARRAYSIZE(tt16));
114 play_ogg_file(tt16);
115 #endif
116 }
117 #endif
118
char_play(char * utf8)119 void char_play(char *utf8)
120 {
121 dbg("char_play %s\n", utf8);
122 if (!phonetic_speak || !(utf8[0]&128))
123 return;
124
125 if (!ch_pho)
126 load_tab_pho_file();
127
128 phokey_t phos[16];
129 int phosN = utf8_pho_keys((char *)utf8, phos);
130 dbg("phosN:%d\n");
131 if (!phosN)
132 return;
133
134 #if 0
135 int i;
136 for(i=0; i < phosN; i++)
137 pho_play(phos[i]);
138 #else
139 pho_play(phos[0]);
140 #endif
141 }
142