libsent/src/anlz/wrwav.c

Go to the documentation of this file.
00001 
00016 /*
00017  * Copyright (c) 1991-2006 Kawahara Lab., Kyoto University
00018  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00019  * Copyright (c) 2005-2006 Julius project team, Nagoya Institute of Technology
00020  * All rights reserved
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 /* open/create a WAVE file for writing, and write header */
00059 /* return file pointer, NULL on failure */
00072 FILE *
00073 wrwav_open(char *filename, int sfreq)
00074 {
00075   FILE *fp;
00076   unsigned int i;
00077   unsigned short s;
00078 
00079   /* open file for writing */
00080   if ((fp = fopen_writefile(filename)) == NULL) return NULL;
00081 
00082   /* write header */
00083   /* first 4 byte: 'R' 'I' 'F' 'F' */
00084   MYWRITE("RIFF", 1, 4, fp);
00085   /* 4 byte: byte num of rest: dummy for now */
00086   i = 0; MYWRITE(&i, 4, 1, fp);
00087 
00088   /* first part: WAVE format specifications */
00089   /* 8 byte: 'W' 'A' 'V' 'E' 'f' 'm' 't' ' ' */
00090   MYWRITE("WAVEfmt ", 1, 8, fp);
00091   /* 4byte: byte size of the next part (16 bytes here) */
00092   i = 16; MYWRITE(&i, 4, 1, fp);
00093   /* 2byte: data format */
00094   s = 1; MYWRITE(&s, 2, 1, fp); /* PCM */
00095   /* 2byte: channel num */
00096   s = 1; MYWRITE(&s, 2, 1, fp); /* mono */
00097   /* 4byte: sampling rate */
00098   i = sfreq; MYWRITE(&i, 4, 1, fp);
00099   /* 4byte: bytes per second */
00100   i = sfreq * sizeof(SP16); MYWRITE(&i, 4, 1, fp);
00101   /* 2bytes: bytes per frame ( = (bytes per sample) x channel ) */
00102   s = sizeof(SP16); MYWRITE(&s, 2, 1, fp);
00103   /* 2bytes: bits per sample */
00104   s = sizeof(SP16) * 8; MYWRITE(&s, 2, 1, fp);
00105   
00106   /* data part header */
00107   MYWRITE("data", 1, 4, fp);
00108   /* data length: dummy for now */
00109   i = 0; MYWRITE(&i, 4, 1, fp);
00110 
00111   totallen = 0;                 /* reset total length */
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 /* close file */
00145 boolean
00146 wrwav_close(FILE *fp)
00147 {
00148   unsigned int i;
00149   
00150   /* overwrite data length after recording */
00151   /* at 5-8(len+36), 41-44 (len) */
00152   if (fseek(fp, 40, SEEK_SET) != 0) { /* error */
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) { /* error */
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   /* close file */
00172   fclose_writefile(fp);
00173 
00174   return(TRUE);
00175 }

Generated on Tue Dec 26 16:16:33 2006 for Julius by  doxygen 1.5.0