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