Julius 4.2
|
00001 00017 /* 00018 * Copyright (c) 1991-2011 Kawahara Lab., Kyoto University 00019 * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology 00020 * Copyright (c) 2005-2011 Julius project team, Nagoya Institute of Technology 00021 * All rights reserved 00022 */ 00023 00024 #include <sent/stddefs.h> 00025 #include <sent/speech.h> 00026 00028 static int totallen; 00029 00040 static boolean 00041 mywrite(void *buf, size_t unitbyte, int unitnum, FILE *fp) 00042 { 00043 int tmp; 00044 #ifdef WORDS_BIGENDIAN 00045 if (unitbyte > 1) swap_bytes(buf, unitbyte, unitnum); 00046 #endif 00047 if ((tmp = myfwrite(buf, unitbyte, unitnum, fp)) < unitnum) { 00048 return(FALSE); 00049 } 00050 #ifdef WORDS_BIGENDIAN 00051 if (unitbyte > 1) swap_bytes(buf, unitbyte, unitnum); 00052 #endif 00053 return(TRUE); 00054 } 00055 00057 #define MYWRITE(A,B,C,D) if (!mywrite(A, B, C, D)) {jlog("Error: wrwav: failed to write wave data\n"); fclose_writefile(fp); return NULL;} 00058 00059 /* open/create a WAVE file for writing, and write header */ 00060 /* return file pointer, NULL on failure */ 00073 FILE * 00074 wrwav_open(char *filename, int sfreq) 00075 { 00076 FILE *fp; 00077 unsigned int i; 00078 unsigned short s; 00079 00080 /* open file for writing */ 00081 if ((fp = fopen_writefile(filename)) == NULL) return NULL; 00082 00083 /* write header */ 00084 /* first 4 byte: 'R' 'I' 'F' 'F' */ 00085 MYWRITE("RIFF", 1, 4, fp); 00086 /* 4 byte: byte num of rest: dummy for now */ 00087 i = 0; MYWRITE(&i, 4, 1, fp); 00088 00089 /* first part: WAVE format specifications */ 00090 /* 8 byte: 'W' 'A' 'V' 'E' 'f' 'm' 't' ' ' */ 00091 MYWRITE("WAVEfmt ", 1, 8, fp); 00092 /* 4byte: byte size of the next part (16 bytes here) */ 00093 i = 16; MYWRITE(&i, 4, 1, fp); 00094 /* 2byte: data format */ 00095 s = 1; MYWRITE(&s, 2, 1, fp); /* PCM */ 00096 /* 2byte: channel num */ 00097 s = 1; MYWRITE(&s, 2, 1, fp); /* mono */ 00098 /* 4byte: sampling rate */ 00099 i = sfreq; MYWRITE(&i, 4, 1, fp); 00100 /* 4byte: bytes per second */ 00101 i = sfreq * sizeof(SP16); MYWRITE(&i, 4, 1, fp); 00102 /* 2bytes: bytes per frame ( = (bytes per sample) x channel ) */ 00103 s = sizeof(SP16); MYWRITE(&s, 2, 1, fp); 00104 /* 2bytes: bits per sample */ 00105 s = sizeof(SP16) * 8; MYWRITE(&s, 2, 1, fp); 00106 00107 /* data part header */ 00108 MYWRITE("data", 1, 4, fp); 00109 /* data length: dummy for now */ 00110 i = 0; MYWRITE(&i, 4, 1, fp); 00111 00112 totallen = 0; /* reset total length */ 00113 00114 return(fp); 00115 } 00116 00126 boolean 00127 wrwav_data(FILE *fp, SP16 *buf, int len) 00128 { 00129 boolean ret; 00130 ret = mywrite(buf, sizeof(SP16), len, fp); 00131 if (ret) totallen += len; 00132 return(ret); 00133 } 00134 00135 /* close file */ 00146 boolean 00147 wrwav_close(FILE *fp) 00148 { 00149 unsigned int i; 00150 00151 /* overwrite data length after recording */ 00152 /* at 5-8(len+36), 41-44 (len) */ 00153 if (fseek(fp, 40, SEEK_SET) != 0) { /* error */ 00154 jlog("Error: wrwav: failed to seek for header\n"); 00155 return(FALSE); 00156 } 00157 i = totallen * sizeof(SP16); 00158 if (!mywrite(&i, 4, 1, fp)) { 00159 jlog("Error: wrwav: failed to re-write header\n"); 00160 return(FALSE); 00161 } 00162 if (fseek(fp, 4, SEEK_SET) != 0) { /* error */ 00163 jlog("Error: wrwav: failed to seek for header\n"); 00164 return(FALSE); 00165 } 00166 i = totallen * sizeof(SP16) + 36; 00167 if (!mywrite(&i, 4, 1, fp)) { 00168 jlog("Error: wrwav: failed to re-write header\n"); 00169 return(FALSE); 00170 } 00171 00172 /* close file */ 00173 fclose_writefile(fp); 00174 00175 return(TRUE); 00176 }