w_decode.c
来自「speech signal process tools」· C语言 代码 · 共 225 行
C
225 行
#ifndef lint static char rcsid[] = "$Header: /home/beldar/stan/sphere/RCS/h_encode.c,v 1.7 1993/03/25 00:20:51 stan Exp stan $";#endif/* File: w_decode.c *//************************************************//* This program decodes data in a NIST file *//* in place (i.e. the filename is not changed). *//************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <sp/sphere.h>char usage[] = "Usage: %s [-vf] -o [ short_10 | short_01 | short_natural | ulaw ] { filein | - } { fileout | - }\n %s [-vi] -o [ short_10 | short_01 | short_natural | ulaw ] file1 file2 ...\n";char * prog;main( argc, argv )int argc;char *argv[];{ struct stat fileinfo; int status = 0; int type; int in_place = 0; int force_overwrite = 0; char *format_conversion="SE-ORIG:SBF-ORIG"; int c; prog = strrchr( argv[0], '/' ); prog = ( prog == CNULL ) ? argv[0] : ( prog + 1 ); while (( c=hs_getopt( argc, argv, "mvifo:" )) != -1 ) switch ( c ) { case 'v': sp_verbose++; printf("verbose = %d\n",sp_verbose); break; case 'i': in_place=1; break; case 'f': force_overwrite=1; break; case 'm': mtrf_set_verbose(1); break; case 'o': if (strsame(hs_optarg,"short_01")) format_conversion = "SE-PCM:SBF-01"; else if (strsame(hs_optarg,"short_10")) format_conversion = "SE-PCM:SBF-10"; else if (strsame(hs_optarg,"short_natural")) format_conversion = "SE-PCM:SBF-N"; else if (strsame(hs_optarg,"ulaw")){ format_conversion = "SE-ULAW"; fprintf(stderr,"Sorry, ULAW conversion has not yet been implmented\n"); exit(-1); } else{ fprintf(stderr,"Error: unknown output type option '%s'\n",hs_optarg); fprintf(stderr,usage,prog,prog); exit(-1); } break; default: fprintf(stderr,"Error: unknown flag -%c\n",c); fprintf(stderr,usage,prog,prog); exit(-1); } if (in_place == 0){ char *filein, *fileout; if (argc - hs_optind != 2){ fprintf(stderr,"Error: Requires 2 filename arguements\n"); fprintf(stderr,usage,prog,prog); exit(-1); } filein=argv[hs_optind]; fileout=argv[hs_optind+1]; if (force_overwrite == 0){ if (stat(fileout,&fileinfo) == 0) { fprintf(stderr,"Unable to overwrite output file %s. Use -f to override\n",fileout); fprintf(stderr,usage,prog,prog); exit(-1); } } hs_resetopt(); if (convert_file(filein,fileout,format_conversion) != 0){ exit(-1); } } else { int op, baseop; if (argc - hs_optind < 1){ fprintf(stderr,"Error: Requires at least one filename\n"); fprintf(stderr,usage,prog,prog); exit(-1); } baseop = hs_optind; hs_resetopt(); for (op=baseop; op<argc; op++) if (do_update(argv[op],format_conversion) != 0) exit(-1); }}convert_file(filein,fileout,format_conversion)char *filein, *fileout, *format_conversion;{ SP_FILE *sp_in, *sp_out; if ((sp_in=sp_open(filein,"r")) == SPNULL){ fprintf(stderr,usage,prog,prog); sp_print_return_status(stderr); fprintf(stderr,"Unable to open file '%s' to update\n",(strsame(filein,"-") ? "stdin" : filein )); return(100); } if ((sp_out=sp_open(fileout,"w")) == SPNULL){ fprintf(stderr,usage,prog,prog); sp_print_return_status(stderr); sp_close(sp_in); fprintf(stderr,"Unable to open file '%s' to update\n",(strsame(fileout,"-") ? "stdout" : fileout )); if (! strsame(fileout,"-")) unlink(fileout); return(100); } if (sp_dup(sp_in,sp_out) != 0){ fprintf(stderr,"Unable to duplicate the input file\n"); sp_print_return_status(stdout); sp_close(sp_in); sp_close(sp_out); if (! strsame(fileout,"-")) unlink(fileout); return(100); } if (sp_set_data_mode(sp_out,format_conversion) != 0){ sp_print_return_status(stderr); fprintf(stderr,"Unable to set data mode to '%s'\n",format_conversion); sp_close(sp_in); sp_close(sp_out); if (! strsame(fileout,"-")) unlink(fileout); return(100); } { char *buff; int tot=0; int ns, nc, nspb; int samples_read, samples_written; ns = sp_in->read_spifr->status->user_sample_count; nc = sp_in->read_spifr->status->user_channel_count; nspb = sp_in->read_spifr->status->user_sample_n_bytes; if ((buff=mtrf_malloc(nc * nspb * 4096)) == CNULL) { sp_close(sp_in); sp_close(sp_out); if (! strsame(fileout,"-")) unlink(fileout); return(100); } do { samples_read = sp_read_data(buff,nspb,4096,sp_in); if (samples_read > 0) { samples_written = sp_write_data(buff,nspb,samples_read,sp_out); if (samples_written != samples_read){ sp_close(sp_in); sp_close(sp_out); if (! strsame(fileout,"-")) unlink(fileout); mtrf_free(buff); return(100); } } else { if (sp_eof(sp_in) == 0) { printf("Error: Zero samples read while not at EOF\n"); sp_close(sp_in); sp_close(sp_out); if (! strsame(fileout,"-")) unlink(fileout); mtrf_free(buff); return(100); } if ((!sp_eof(sp_in)) || (sp_error(sp_in) >= 100)) { /* a checksum error occured, close the sp and */ sp_print_return_status(stdout); sp_close(sp_in); sp_close(sp_out); if (! strsame(fileout,"-")) unlink(fileout); mtrf_free(buff); return(100); } } } while (samples_read > 0); mtrf_free(buff); sp_close(sp_in); sp_close(sp_out); }}int do_update(filein,format_conversion)char *filein ,*format_conversion;{ SP_FILE *sp; if ((sp=sp_open(filein,"u")) == SPNULL){ fprintf(stderr,usage,prog,prog); sp_print_return_status(stderr); fprintf(stderr,"Unable to open file '%s' to update\n",filein); return(100); } if (sp_set_data_mode(sp,format_conversion) != 0){ fprintf(stderr,usage,prog,prog); sp_print_return_status(stderr); fprintf(stderr,"Unable to set data mode to '%s'\n",format_conversion); sp_close(sp); return(100); } if (sp_close(sp) != 0){ fprintf(stderr,usage,prog,prog); sp_print_return_status(stderr); fprintf(stderr,"File Close failed\n"); return(100); } return(0);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?