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 + -
显示快捷键?