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 }