libsent/src/adin/adin_sndfile.c

Go to the documentation of this file.
00001 
00066 /*
00067  * Copyright (c) 1991-2006 Kawahara Lab., Kyoto University
00068  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00069  * Copyright (c) 2005-2006 Julius project team, Nagoya Institute of Technology
00070  * All rights reserved
00071  */
00072 
00073 #include <sent/stddefs.h>
00074 #include <sent/speech.h>
00075 #include <sent/adin.h>
00076 
00077 #ifdef HAVE_LIBSNDFILE
00078 
00079 /* sound header */
00080 #include <sndfile.h>
00081 
00082 static int sfreq;               
00083 static SF_INFO sinfo;           
00084 static SNDFILE *sp;             
00085 static boolean from_file;       
00086 static FILE *fp_list;           
00087 
00089 static boolean
00090 check_format(SF_INFO *s)
00091 {
00092   if ((s->format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) {
00093     if (s->samplerate != sfreq) {
00094       j_printerr("adin_sndfile: sample rate != %d, it's %d Hz data\n", sfreq, s->samplerate);
00095       return FALSE;
00096     }
00097   }
00098   if (s->channels != 1) {
00099     j_printerr("adin_sndfile: channel num != 1, it has %d channels\n", s->channels);
00100     return FALSE;
00101   }
00102 #ifdef HAVE_LIBSNDFILE_VER1
00103   if ((s->format & SF_FORMAT_SUBMASK) != SF_FORMAT_PCM_16) {
00104     j_printerr("adin_sndfile1: not 16-bit data\n");
00105     return FALSE;
00106   }
00107 #else
00108   if (s->pcmbitwidth != 16) {
00109     j_printerr("adin_sndfile: not 16-bit data, it's %d bit\n", s->pcmbitwidth);
00110     return FALSE;
00111   }
00112 #endif
00113   return TRUE;
00114 }
00115 
00117 static void
00118 print_format(SF_INFO *s)
00119 {
00120   printf("file format: ");
00121   switch(s->format & SF_FORMAT_TYPEMASK) {
00122   case SF_FORMAT_WAV:    j_printf("Microsoft WAV"); break;
00123   case SF_FORMAT_AIFF:   j_printf("Apple/SGI AIFF"); break;
00124   case SF_FORMAT_AU:     j_printf("Sun/NeXT AU"); break;
00125 #ifndef HAVE_LIBSNDFILE_VER1
00126   case SF_FORMAT_AULE:   j_printf("DEC AU"); break;
00127 #endif
00128   case SF_FORMAT_RAW:    j_printf("RAW"); break;
00129   case SF_FORMAT_PAF:    j_printf("Ensoniq PARIS"); break;
00130   case SF_FORMAT_SVX:    j_printf("Amiga IFF / SVX8 / SV16"); break;
00131   case SF_FORMAT_NIST:   j_printf("Sphere NIST"); break;
00132 #ifdef HAVE_LIBSNDFILE_VER1
00133   case SF_FORMAT_VOC:    j_printf("VOC file"); break;
00134   case SF_FORMAT_IRCAM:  j_printf("Berkeley/IRCAM/CARL"); break;
00135   case SF_FORMAT_W64:    j_printf("Sonic Foundry's 64bit RIFF/WAV"); break;
00136   case SF_FORMAT_MAT4:   j_printf("Matlab (tm) V4.2 / GNU Octave 2.0"); break;
00137   case SF_FORMAT_MAT5:   j_printf("Matlab (tm) V5.0 / GNU Octave 2.1"); break;
00138 #endif
00139   default: j_printf("UNKNOWN TYPE"); break;
00140   }
00141   switch(s->format & SF_FORMAT_SUBMASK) {
00142 #ifdef HAVE_LIBSNDFILE_VER1
00143   case SF_FORMAT_PCM_U8:    j_printf(", Unsigned 8 bit PCM"); break;
00144   case SF_FORMAT_PCM_S8:    j_printf(", Signed 8 bit PCM"); break;
00145   case SF_FORMAT_PCM_16:    j_printf(", Signed 16 bit PCM"); break;
00146   case SF_FORMAT_PCM_24:    j_printf(", Signed 24 bit PCM"); break;
00147   case SF_FORMAT_PCM_32:    j_printf(", Signed 32 bit PCM"); break;
00148   case SF_FORMAT_FLOAT:     j_printf(", 32bit float"); break;
00149   case SF_FORMAT_DOUBLE:    j_printf(", 64bit float"); break;
00150   case SF_FORMAT_ULAW:      j_printf(", U-Law"); break;
00151   case SF_FORMAT_ALAW:      j_printf(", A-Law"); break;
00152   case SF_FORMAT_IMA_ADPCM: j_printf(", IMA ADPCM"); break;
00153   case SF_FORMAT_MS_ADPCM:  j_printf(", Microsoft ADPCM"); break;
00154   case SF_FORMAT_GSM610:    j_printf(", GSM 6.10, "); break;
00155   case SF_FORMAT_G721_32:   j_printf(", 32kbs G721 ADPCM"); break;
00156   case SF_FORMAT_G723_24:   j_printf(", 24kbs G723 ADPCM"); break;
00157   case SF_FORMAT_G723_40:   j_printf(", 40kbs G723 ADPCM"); break;
00158 #else
00159   case SF_FORMAT_PCM:       j_printf(", PCM"); break;
00160   case SF_FORMAT_FLOAT:     j_printf(", floats"); break;
00161   case SF_FORMAT_ULAW:      j_printf(", U-Law"); break;
00162   case SF_FORMAT_ALAW:      j_printf(", A-Law"); break;
00163   case SF_FORMAT_IMA_ADPCM: j_printf(", IMA ADPCM"); break;
00164   case SF_FORMAT_MS_ADPCM:  j_printf(", Microsoft ADPCM"); break;
00165   case SF_FORMAT_PCM_BE:    j_printf(", Big endian PCM"); break;
00166   case SF_FORMAT_PCM_LE:    j_printf(", Little endian PCM"); break;
00167   case SF_FORMAT_PCM_S8:    j_printf(", Signed 8 bit PCM"); break;
00168   case SF_FORMAT_PCM_U8:    j_printf(", Unsigned 8 bit PCM"); break;
00169   case SF_FORMAT_SVX_FIB:   j_printf(", SVX Fibonacci Delta"); break;
00170   case SF_FORMAT_SVX_EXP:   j_printf(", SVX Exponential Delta"); break;
00171   case SF_FORMAT_GSM610:    j_printf(", GSM 6.10, "); break;
00172   case SF_FORMAT_G721_32:   j_printf(", 32kbs G721 ADPCM"); break;
00173   case SF_FORMAT_G723_24:   j_printf(", 24kbs G723 ADPCM"); break;
00174 #endif
00175   default: j_printf(", UNKNOWN SUBTYPE"); break;
00176   }
00177 
00178 #ifdef HAVE_LIBSNDFILE_VER1
00179   switch(s->format & SF_FORMAT_ENDMASK) {
00180   case SF_ENDIAN_FILE:      j_printf(", file native endian"); break;
00181   case SF_ENDIAN_LITTLE:    j_printf(", forced little endian"); break;
00182   case SF_ENDIAN_BIG:       j_printf(", forced big endian"); break;
00183   case SF_ENDIAN_CPU:       j_printf(", forced CPU native endian"); break;
00184   }
00185   j_printf(", %d Hz, %d channels\n", s->samplerate, s->channels);
00186 #else
00187   j_printf(", %d bit, %d Hz, %d channels\n", s->pcmbitwidth, s->samplerate, s->channels);
00188 #endif
00189 }
00190 
00191 
00201 boolean
00202 adin_sndfile_standby(int freq, void *arg)
00203 {
00204   char *fname = arg;
00205   if (fname != NULL) {
00206     /* read input filename from file */
00207     if ((fp_list = fopen(fname, "r")) == NULL) {
00208       j_printerr("failed to open %s\n", fname);
00209       return(FALSE);
00210     }
00211     from_file = TRUE;
00212   } else {
00213     /* read filename from stdin */
00214     from_file = FALSE;
00215   }
00216   /* store sampling frequency */
00217   sfreq = freq;
00218   
00219   return(TRUE);
00220 }
00221 
00231 boolean
00232 adin_sndfile_begin()
00233 {
00234   char *speechfilename;
00235   boolean readp;
00236 
00237   /* ready to read next input */
00238   readp = FALSE;
00239   while(readp == FALSE) {
00240     if (from_file) {
00241       /* read file name from listfile */
00242       speechfilename = (char *)mymalloc(500);
00243       do {
00244         if (getl_fp(speechfilename, 500, fp_list) == NULL) { /* end of input */
00245           free(speechfilename);
00246           fclose(fp_list);
00247           return(FALSE); /* end of input */
00248         }
00249       } while (speechfilename[0] == '#'); /* skip comment */
00250     } else {
00251       /* read file name from stdin */
00252       speechfilename = get_line("enter filename->");
00253       if (speechfilename == NULL) return (FALSE);       /* end of input */
00254     }
00255     /* open input file */
00256 #ifndef HAVE_LIBSNDFILE_VER1
00257     sinfo.samplerate = sfreq;
00258     sinfo.pcmbitwidth = 16;
00259     sinfo.channels = 1;
00260 #endif
00261     sinfo.format = 0x0;
00262     if ((sp = 
00263 #ifdef HAVE_LIBSNDFILE_VER1
00264          sf_open(speechfilename, SFM_READ, &sinfo)
00265 #else
00266          sf_open_read(speechfilename, &sinfo)
00267 #endif
00268          ) == NULL) {
00269       /* retry assuming raw format */
00270       sinfo.samplerate = sfreq;
00271       sinfo.channels = 1;
00272 #ifdef HAVE_LIBSNDFILE_VER1
00273       sinfo.format = SF_FORMAT_RAW | SF_FORMAT_PCM_16 | SF_ENDIAN_BIG;
00274 #else
00275       sinfo.pcmbitwidth = 16;
00276       sinfo.format = SF_FORMAT_RAW | SF_FORMAT_PCM_BE;
00277 #endif
00278       if ((sp =
00279 #ifdef HAVE_LIBSNDFILE_VER1
00280            sf_open(speechfilename, SFM_READ, &sinfo)
00281 #else
00282            sf_open_read(speechfilename, &sinfo)
00283 #endif
00284            ) == NULL) {
00285         sf_perror(sp);
00286         j_printerr("Error in opening speech data: \"%s\"\n",speechfilename);
00287       }
00288     }
00289     if (sp != NULL) {           /* open success */
00290       if (! check_format(&sinfo)) {
00291         j_printerr("Error: invalid format: \"%s\"\n",speechfilename);
00292         print_format(&sinfo);
00293       } else {
00294         j_printf("\ninput speechfile: %s\n",speechfilename);
00295         print_format(&sinfo);
00296         readp = TRUE;
00297       }
00298     }
00299     free(speechfilename);
00300   }
00301   return TRUE;
00302 }
00303 
00312 int
00313 adin_sndfile_read(SP16 *buf, int sampnum)
00314 {
00315   int cnt;
00316 
00317   cnt = sf_read_short(sp, buf, sampnum);
00318   if (cnt == 0) {               /* EOF */
00319     return -1;
00320   } else if (cnt < 0) {         /* error */
00321     sf_perror(sp);
00322     sf_close(sp);
00323     return -2;          /* error */
00324   }
00325   return cnt;
00326 }
00327 
00333 boolean
00334 adin_sndfile_end()
00335 {
00336   /* close files */
00337   if (sf_close(sp) != 0) {
00338     sf_perror(sp);
00339     j_printerr("adin_sndfile: failed to close\n");
00340     return FALSE;
00341   }
00342   return TRUE;
00343 }
00344 
00345 #endif /* ~HAVE_LIBSNDFILE */

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