00001
00062
00063
00064
00065
00066
00067
00068
00069
00070 #include <sent/stddefs.h>
00071 #include <sent/speech.h>
00072 #include <sent/adin.h>
00073
00074 static FILE *gfp;
00075 static boolean wav_p;
00076 static int maxlen;
00077 static int nowlen;
00078
00083 static SP16 pre_data[2];
00084 static boolean has_pre;
00085
00086 static unsigned int sfreq;
00087
00088 static char speechfilename[MAXPATHLEN];
00089 static char *stdin_buf = NULL;
00090
00091
00092
00093
00105 static boolean
00106 myread(void *buf, size_t unitbyte, int unitnum, FILE *fp)
00107 {
00108 int tmp;
00109 if ((tmp = fread(buf, unitbyte, unitnum, fp)) < unitnum) {
00110 return(FALSE);
00111 }
00112 #ifdef WORDS_BIGENDIAN
00113 swap_bytes(buf, unitbyte, unitnum);
00114 #endif
00115 return(TRUE);
00116 }
00118 #define MYREAD(A,B,C,D) if (!myread(A, B, C, D)) {jlog("Error: adin_file: file is corrupted\n"); return -1;}
00119
00133 static boolean
00134 setup_wav(FILE *fp)
00135 {
00136 char dummy[9];
00137 unsigned int i, len;
00138 unsigned short s;
00139
00140
00141
00142 MYREAD(dummy, 1, 4, fp);
00143
00144
00145 MYREAD(dummy, 1, 4, fp);
00146 if (dummy[0] != 'W' ||
00147 dummy[1] != 'A' ||
00148 dummy[2] != 'V' ||
00149 dummy[3] != 'E') {
00150 jlog("Error: adin_file: WAVE header not found, file corrupted?\n");
00151 return FALSE;
00152 }
00153
00154 MYREAD(dummy, 1, 4, fp);
00155 if (dummy[0] != 'f' ||
00156 dummy[1] != 'm' ||
00157 dummy[2] != 't' ||
00158 dummy[3] != ' ') {
00159 jlog("Error: adin_file: fmt chunk not found, file corrupted?\n");
00160 return FALSE;
00161 }
00162
00163 MYREAD(&len, 4, 1, fp);
00164
00165
00166 MYREAD(&s, 2, 1, fp);
00167 if (s != 1) {
00168 jlog("Error: adin_file: data format != PCM (id=%d)\n", s);
00169 return FALSE;
00170 }
00171
00172 MYREAD(&s, 2, 1, fp);
00173 if (s >= 2) {
00174 jlog("Error: adin_file: channel num != 1 (%d)\n", s);
00175 return FALSE;
00176 }
00177
00178 MYREAD(&i, 4, 1, fp);
00179 if (i != sfreq) {
00180 jlog("Error: adin_file: sampling rate != %d (%d)\n", sfreq, i);
00181 return FALSE;
00182 }
00183
00184 MYREAD(&i, 4, 1, fp);
00185 if (i != sfreq * sizeof(SP16)) {
00186 jlog("Error: adin_file: bytes per second != %d (%d)\n", sfreq * sizeof(SP16), i);
00187 return FALSE;
00188 }
00189
00190 MYREAD(&s, 2, 1, fp);
00191 if (s != 2) {
00192 jlog("Error: adin_file: (bytes per sample) x channel != 2 (%d)\n", s);
00193 return FALSE;
00194 }
00195
00196 MYREAD(&s, 2, 1, fp);
00197 if (s != 16) {
00198 jlog("Error: adin_file: bits per sample != 16 (%d)\n", s);
00199 return FALSE;
00200 }
00201
00202 if (len > 16) {
00203 len -= 16;
00204 while (len > 0) {
00205 if (len > 8) {
00206 MYREAD(dummy, 1, 8, fp);
00207 len -= 8;
00208 } else {
00209 MYREAD(dummy, 1, len, fp);
00210 len = 0;
00211 }
00212 }
00213 }
00214
00215
00216
00217 while (myread(dummy, 1, 4, fp)) {
00218 MYREAD(&len, 4, 1, fp);
00219 if (dummy[0] == 'd' &&
00220 dummy[1] == 'a' &&
00221 dummy[2] == 't' &&
00222 dummy[3] == 'a') {
00223 break;
00224 }
00225 for (i=0;i<len;i++) myread(dummy, 1, 1, fp);
00226 }
00227
00228 maxlen = len / sizeof(SP16);
00229 nowlen = 0;
00230 return TRUE;
00231 }
00232
00242 static boolean
00243 adin_file_open(char *filename)
00244 {
00245 FILE *fp;
00246 char dummy[4];
00247
00248 if (filename != NULL) {
00249 if ((fp = fopen(filename, "rb")) == NULL) {
00250 jlog("Error: adin_file: failed to open %s\n",filename);
00251 return(FALSE);
00252 }
00253 } else {
00254 fp = stdin;
00255 #if defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__MINGW32__)
00256 if (_setmode( _fileno( stdin ), _O_BINARY ) == -1) {
00257 jlog("Error: adin_file: _setmode() failed\n");
00258 }
00259 #endif
00260 if (stdin_buf == NULL) {
00261 stdin_buf = (char *)mymalloc(BUFSIZ);
00262 setvbuf(stdin, stdin_buf, _IOFBF, BUFSIZ);
00263 }
00264 }
00265
00266
00267 if (fread(dummy, 1, 4, fp) < 4) {
00268 jlog("Error: adin_file: size less than 4 bytes?\n",filename);
00269 fclose(fp);
00270 return(FALSE);
00271 }
00272 if (dummy[0] == 'R' &&
00273 dummy[1] == 'I' &&
00274 dummy[2] == 'F' &&
00275 dummy[3] == 'F') {
00276
00277 wav_p = TRUE;
00278 has_pre = FALSE;
00279 if (setup_wav(fp) == FALSE) {
00280 jlog("Error: adin_file: error in parsing wav header at %s\n",filename);
00281 fclose(fp);
00282 return(FALSE);
00283 }
00284 } else {
00285
00286 wav_p = FALSE;
00287 memcpy(pre_data, dummy, 4);
00288 has_pre = TRUE;
00289 }
00290
00291 gfp = fp;
00292
00293 return(TRUE);
00294 }
00295
00301 static boolean
00302 adin_file_close()
00303 {
00304 FILE *fp;
00305
00306 fp = gfp;
00307 if (fclose(fp) != 0) {
00308 jlog("Error: adin_file: failed to close file\n");
00309 return FALSE;
00310 }
00311 return TRUE;
00312 }
00313
00314 static boolean from_file;
00315 static FILE *fp_list;
00316
00325 boolean
00326 adin_file_standby(int freq, void *arg)
00327 {
00328 char *fname = arg;
00329 if (fname != NULL) {
00330
00331 if ((fp_list = fopen(fname, "r")) == NULL) {
00332 jlog("Error: adin_file: failed to open %s\n", fname);
00333 return(FALSE);
00334 }
00335 from_file = TRUE;
00336 } else {
00337
00338 from_file = FALSE;
00339 }
00340
00341 sfreq = freq;
00342
00343 return(TRUE);
00344 }
00345
00355 boolean
00356 adin_file_begin()
00357 {
00358 boolean readp;
00359
00360
00361 readp = FALSE;
00362 while(readp == FALSE) {
00363 if (from_file) {
00364
00365 do {
00366 if (getl_fp(speechfilename, MAXPATHLEN, fp_list) == NULL) {
00367 fclose(fp_list);
00368 return(FALSE);
00369 }
00370 } while (speechfilename[0] == '#');
00371 } else {
00372
00373 if (get_line_from_stdin(speechfilename, MAXPATHLEN, "enter filename->") == NULL) {
00374 return (FALSE);
00375 }
00376 }
00377
00378 if (adin_file_open(speechfilename) == FALSE) {
00379 jlog("Error: adin_file: failed to read speech data: \"%s\"\n", speechfilename);
00380 } else {
00381 jlog("Stat: adin_file: input speechfile: %s\n", speechfilename);
00382 readp = TRUE;
00383 }
00384 }
00385 return TRUE;
00386 }
00387
00396 int
00397 adin_file_read(SP16 *buf, int sampnum)
00398 {
00399 FILE *fp;
00400 int cnt;
00401
00402 fp = gfp;
00403
00404 if (wav_p) {
00405 cnt = fread(buf, sizeof(SP16), sampnum, fp);
00406 if (cnt == 0) {
00407 if (feof(fp)) return -1;
00408 if (ferror(fp)) {
00409 jlog("Error: adin_file: an error occured while reading file\n");
00410 adin_file_close();
00411 return -2;
00412 }
00413 }
00414 if (nowlen + cnt > maxlen) {
00415 cnt = maxlen - nowlen;
00416 }
00417 nowlen += cnt;
00418 } else {
00419 if (has_pre) {
00420 buf[0] = pre_data[0]; buf[1] = pre_data[1];
00421 has_pre = FALSE;
00422 cnt = fread(&(buf[2]), sizeof(SP16), sampnum - 2, fp);
00423 if (cnt == 0) {
00424 if (feof(fp)) return -1;
00425 if (ferror(fp)) {
00426 jlog("Error: adin_file: an error occured file reading file\n");
00427 adin_file_close();
00428 return -2;
00429 }
00430 }
00431 cnt += 2;
00432 } else {
00433 cnt = fread(buf, sizeof(SP16), sampnum, fp);
00434 if (cnt == 0) {
00435 if (feof(fp)) return -1;
00436 if (ferror(fp)) {
00437 jlog("Error: adin_file: an error occured file reading file\n");
00438 adin_file_close();
00439 return -2;
00440 }
00441 }
00442 }
00443 }
00444
00445
00446 #ifdef WORDS_BIGENDIAN
00447 if (wav_p) swap_sample_bytes(buf, cnt);
00448 #else
00449 if (!wav_p) swap_sample_bytes(buf, cnt);
00450 #endif
00451 return cnt;
00452 }
00453
00459 boolean
00460 adin_file_end()
00461 {
00462
00463 adin_file_close();
00464 return TRUE;
00465 }
00466
00475 boolean
00476 adin_stdin_standby(int freq, void *arg)
00477 {
00478
00479 sfreq = freq;
00480 return(TRUE);
00481 }
00482
00488 boolean
00489 adin_stdin_begin()
00490 {
00491 if (feof(stdin)) {
00492 jlog("Error: adin_stdin: stdin reached EOF\n");
00493 return FALSE;
00494 } else {
00495
00496 if (adin_file_open(NULL) == FALSE) {
00497 jlog("Error: adin_stdin: failed to read speech data from stdin\n");
00498 return FALSE;
00499 }
00500 jlog("Stat: adin_stdin: reading wavedata from stdin...\n");
00501 }
00502 return TRUE;
00503 }
00504
00513 int
00514 adin_stdin_read(SP16 *buf, int sampnum)
00515 {
00516 int cnt;
00517
00518 if (wav_p) {
00519 cnt = myfread(buf, sizeof(SP16), sampnum, stdin);
00520 if (cnt == 0) {
00521 if (feof(stdin)) return -1;
00522 if (ferror(stdin)) {
00523 jlog("Error: adin_stdin: an error occured while reading stdin\n");
00524 return -2;
00525 }
00526 }
00527 } else {
00528 if (has_pre) {
00529 buf[0] = pre_data[0]; buf[1] = pre_data[1];
00530 has_pre = FALSE;
00531 cnt = fread(&(buf[2]), sizeof(SP16), sampnum - 2, stdin);
00532 if (cnt == 0) {
00533 if (feof(stdin)) return -1;
00534 if (ferror(stdin)) {
00535 jlog("Error: adin_stdin: an error occured while reading stdin\n");
00536 return -2;
00537 }
00538 }
00539 cnt += 2;
00540 } else {
00541 cnt = fread(buf, sizeof(SP16), sampnum, stdin);
00542 if (cnt == 0) {
00543 if (feof(stdin)) return -1;
00544 if (ferror(stdin)) {
00545 jlog("Error: adin_stdin: an error occured while reading stdin\n");
00546 return -2;
00547 }
00548 }
00549 }
00550 }
00551
00552
00553
00554 #ifdef WORDS_BIGENDIAN
00555 if (wav_p) swap_sample_bytes(buf, cnt);
00556 #else
00557 if (!wav_p) swap_sample_bytes(buf, cnt);
00558 #endif
00559 return cnt;
00560 }
00561
00569 char *
00570 adin_file_get_current_filename()
00571 {
00572 return(speechfilename);
00573 }