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 }