00001
00066
00067
00068
00069
00070
00071
00072
00073 #include <sent/stddefs.h>
00074 #include <sent/speech.h>
00075 #include <sent/adin.h>
00076
00077 #ifdef HAVE_LIBSNDFILE
00078
00079
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
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
00214 from_file = FALSE;
00215 }
00216
00217 sfreq = freq;
00218
00219 return(TRUE);
00220 }
00221
00231 boolean
00232 adin_sndfile_begin()
00233 {
00234 char *speechfilename;
00235 boolean readp;
00236
00237
00238 readp = FALSE;
00239 while(readp == FALSE) {
00240 if (from_file) {
00241
00242 speechfilename = (char *)mymalloc(500);
00243 do {
00244 if (getl_fp(speechfilename, 500, fp_list) == NULL) {
00245 free(speechfilename);
00246 fclose(fp_list);
00247 return(FALSE);
00248 }
00249 } while (speechfilename[0] == '#');
00250 } else {
00251
00252 speechfilename = get_line("enter filename->");
00253 if (speechfilename == NULL) return (FALSE);
00254 }
00255
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
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) {
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) {
00319 return -1;
00320 } else if (cnt < 0) {
00321 sf_perror(sp);
00322 sf_close(sp);
00323 return -2;
00324 }
00325 return cnt;
00326 }
00327
00333 boolean
00334 adin_sndfile_end()
00335 {
00336
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