w_encode.c

来自「speech signal process tools」· C语言 代码 · 共 239 行

C
239
字号
#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_encode.c *//************************************************//* This program encodes 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 [-dmvf] -t [ wavpack | shorten | ulaw ] { filein | - } { fileout | - }\n        %s [-dmvi] -t [ wavpack | shorten | 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;    int dump_compression = 0;    int maintain_sbf = 0;    char format_conversion[256];    int c;    char *format_conversion_type=CNULL;    format_conversion[0] = '\0';    prog = strrchr( argv[0], '/' );    prog = ( prog == CNULL ) ? argv[0] : ( prog + 1 );    while (( c=hs_getopt( argc, argv, "dmvift:" )) != -1 )	switch ( c ) {	  case 'v':	    sp_verbose++;	    break;	  case 'i':	    in_place=1;	    break;	  case 'f':	    force_overwrite=1;	    break;	  case 'd':	    dump_compression=1;	    break;	  case 'm':	    maintain_sbf=1;	    break;	  case 't':	    if (strsame(hs_optarg,"wavpack"))		format_conversion_type = "wavpack";	    else  if (strsame(hs_optarg,"shorten"))		format_conversion_type = "shorten";	    else  if (strsame(hs_optarg,"ulaw"))		format_conversion_type = "ulaw";	    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 (format_conversion_type == CNULL){	fprintf(stderr,"Output conversion type required\n");	fprintf(stderr,usage,prog,prog);	exit(-1);    }    if (strsame(format_conversion_type,"wavpack"))	strcat(format_conversion,"SE-WAVPACK:");    else  if (strsame(format_conversion_type,"shorten"))	strcat(format_conversion,"SE-SHORTEN:");    else  if (strsame(format_conversion_type,"ulaw"))	strcat(format_conversion,"SE-ULAW:");    else {	fprintf(stderr,"Internal error\nContact Jon Fiscus");	exit(-1);    }    if (maintain_sbf == 1)	strcat(format_conversion,"SBF-ORIG");    else	strcat(format_conversion,"SBF-N");    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_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 + -
显示快捷键?