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