00001
00016
00017
00018
00019
00020
00021
00022
00023 #include <sent/stddefs.h>
00024 #include <sent/speech.h>
00025
00027 static int totallen;
00028
00039 static boolean
00040 mywrite(void *buf, size_t unitbyte, int unitnum, FILE *fp)
00041 {
00042 int tmp;
00043 #ifdef WORDS_BIGENDIAN
00044 if (unitbyte > 1) swap_bytes(buf, unitbyte, unitnum);
00045 #endif
00046 if ((tmp = myfwrite(buf, unitbyte, unitnum, fp)) < unitnum) {
00047 return(FALSE);
00048 }
00049 #ifdef WORDS_BIGENDIAN
00050 if (unitbyte > 1) swap_bytes(buf, unitbyte, unitnum);
00051 #endif
00052 return(TRUE);
00053 }
00054
00056 #define MYWRITE(A,B,C,D) if (!mywrite(A, B, C, D)) {j_printerr("wrwav_open: write failed\n"); fclose_writefile(fp); return NULL;}
00057
00058
00059
00072 FILE *
00073 wrwav_open(char *filename, int sfreq)
00074 {
00075 FILE *fp;
00076 unsigned int i;
00077 unsigned short s;
00078
00079
00080 if ((fp = fopen_writefile(filename)) == NULL) return NULL;
00081
00082
00083
00084 MYWRITE("RIFF", 1, 4, fp);
00085
00086 i = 0; MYWRITE(&i, 4, 1, fp);
00087
00088
00089
00090 MYWRITE("WAVEfmt ", 1, 8, fp);
00091
00092 i = 16; MYWRITE(&i, 4, 1, fp);
00093
00094 s = 1; MYWRITE(&s, 2, 1, fp);
00095
00096 s = 1; MYWRITE(&s, 2, 1, fp);
00097
00098 i = sfreq; MYWRITE(&i, 4, 1, fp);
00099
00100 i = sfreq * sizeof(SP16); MYWRITE(&i, 4, 1, fp);
00101
00102 s = sizeof(SP16); MYWRITE(&s, 2, 1, fp);
00103
00104 s = sizeof(SP16) * 8; MYWRITE(&s, 2, 1, fp);
00105
00106
00107 MYWRITE("data", 1, 4, fp);
00108
00109 i = 0; MYWRITE(&i, 4, 1, fp);
00110
00111 totallen = 0;
00112
00113 return(fp);
00114 }
00115
00125 boolean
00126 wrwav_data(FILE *fp, SP16 *buf, int len)
00127 {
00128 boolean ret;
00129 ret = mywrite(buf, sizeof(SP16), len, fp);
00130 if (ret) totallen += len;
00131 return(ret);
00132 }
00133
00134
00145 boolean
00146 wrwav_close(FILE *fp)
00147 {
00148 unsigned int i;
00149
00150
00151
00152 if (fseek(fp, 40, SEEK_SET) != 0) {
00153 perror("wrwav_close");
00154 return(FALSE);
00155 }
00156 i = totallen * sizeof(SP16);
00157 if (!mywrite(&i, 4, 1, fp)) {
00158 j_printerr("wrwav_close: failed to re-write header\n");
00159 return(FALSE);
00160 }
00161 if (fseek(fp, 4, SEEK_SET) != 0) {
00162 perror("wrwav_close");
00163 return(FALSE);
00164 }
00165 i = totallen * sizeof(SP16) + 36;
00166 if (!mywrite(&i, 4, 1, fp)) {
00167 j_printerr("wrwav_close: failed to re-write header\n");
00168 return(FALSE);
00169 }
00170
00171
00172 fclose_writefile(fp);
00173
00174 return(TRUE);
00175 }