00001
00017
00018
00019
00020
00021
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
00060
00073 FILE *
00074 wrwav_open(char *filename, int sfreq)
00075 {
00076 FILE *fp;
00077 unsigned int i;
00078 unsigned short s;
00079
00080
00081 if ((fp = fopen_writefile(filename)) == NULL) return NULL;
00082
00083
00084
00085 MYWRITE("RIFF", 1, 4, fp);
00086
00087 i = 0; MYWRITE(&i, 4, 1, fp);
00088
00089
00090
00091 MYWRITE("WAVEfmt ", 1, 8, fp);
00092
00093 i = 16; MYWRITE(&i, 4, 1, fp);
00094
00095 s = 1; MYWRITE(&s, 2, 1, fp);
00096
00097 s = 1; MYWRITE(&s, 2, 1, fp);
00098
00099 i = sfreq; MYWRITE(&i, 4, 1, fp);
00100
00101 i = sfreq * sizeof(SP16); MYWRITE(&i, 4, 1, fp);
00102
00103 s = sizeof(SP16); MYWRITE(&s, 2, 1, fp);
00104
00105 s = sizeof(SP16) * 8; MYWRITE(&s, 2, 1, fp);
00106
00107
00108 MYWRITE("data", 1, 4, fp);
00109
00110 i = 0; MYWRITE(&i, 4, 1, fp);
00111
00112 totallen = 0;
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
00146 boolean
00147 wrwav_close(FILE *fp)
00148 {
00149 unsigned int i;
00150
00151
00152
00153 if (fseek(fp, 40, SEEK_SET) != 0) {
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) {
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
00173 fclose_writefile(fp);
00174
00175 return(TRUE);
00176 }