tsphere.c

来自「speech signal process tools」· C语言 代码 · 共 1,922 行 · 第 1/5 页

C
1,922
字号
		goto FATAL_QUIT;	    }	    	    n1 = sp_read_data(seek_data,nsnb,size,sp);	    if (n1 != size){		fprintf(spfp,"\nsp_read_data failed.\n");		goto FATAL_QUIT;	    }	    if (memcmp((char *)seek_data,((char *)orig_data) + nsnb*nchan*loc,		       size*nchan*nsnb)){		fprintf(spfp,"\nError: byte-comparison failed\n");		goto FATAL_EXIT;	    }	    if (do_sp_tell_check(sp,file) != 0)		goto FATAL_EXIT;	}	fprintf(spfp,"\n");    }    goto CLEAN_UP;      FATAL_QUIT:    sp_print_return_status(spfp);  FATAL_EXIT:    exit (1);      CLEAN_UP:    if (sp != SPNULL) {	if (seek_data != (void *)0) sp_data_free(sp,seek_data);	sp_close(sp);    }    if (orig_data != (void *)0) mtrf_free(orig_data);    return;}/* do the sp_tell check */int do_sp_tell_check(SP_FILE *sp, char *file){    int file_byte_loc, sptell_byte_loc, file_samples;    SPIFR *spifr;    if (sp->open_mode == SP_mode_read)	spifr = sp->read_spifr;    else if (sp->open_mode == SP_mode_write){	spifr = sp->write_spifr;	if (fob_fflush(spifr->waveform->sp_fob) != 0){	    fprintf(spfp,"Error: do_sp_tell_check unable to flush the buffer"		    "for file '%s'.",file);	    return(1);	}    } else {	fprintf(spfp,"Error: do_sp_tell_check called on file '%s' opened"		" for something other that read or write",file);	return(1);    }	        file_byte_loc = fob_ftell(spifr->waveform->sp_fob);    if ((! fob_is_fp(spifr->waveform->sp_fob)) ||	(fob_is_fp(spifr->waveform->sp_fob) && spifr->status->is_temp_file)) 	file_byte_loc += spifr->waveform->header_data_size;    file_samples = 	(fob_ftell(spifr->waveform->sp_fob) -	 ((fob_is_fp(spifr->waveform->sp_fob) && 	   !(spifr->status->is_temp_file)) ?	  spifr->waveform->header_data_size : 0)) / 	 (spifr->status->file_sample_n_bytes * 	  spifr->status->file_channel_count);        if ((sptell_byte_loc = sp_tell(sp)) < 0){	fprintf(spfp,"Error: sp_tell() failed\n");	sp_print_return_status(spfp);	return(1);    }    sptell_byte_loc = 	(sptell_byte_loc * 	 spifr->status->file_sample_n_bytes * 	 spifr->status->file_channel_count) + 	     spifr->waveform->header_data_size;    if (file_byte_loc != sptell_byte_loc){	fprintf(spfp,"\nError: sp_tell on '%s' failed to return a correct ",		file);	fprintf(spfp,"value. %d != expected %d\n",sp_tell(sp),file_samples);	return(1);    }    return(0);}void rewind_tests(int test){    fprintf(spfp,"Test %2d: Rewind waveform tests:\n",test);           fprintf(spfp,"---- Rewind without data_mode modifications\n");    rewind_file_compare(EX1_10,EX1_10,"","","");    rewind_file_compare(EX1_10,EX1_01,"","","");    rewind_file_compare(EX1_01,EX1_10,"","","");    rewind_file_compare(EX5_2CHAN,EX5_2CHAN,"","","");    rewind_file_compare(EX5_2CHAN,EX5_2CHAN,"","","");    rewind_file_compare(EX5_2CHAN_SHORTEN,EX5_2CHAN,"","","");    rewind_file_compare(EX5_2CHAN_WAVPACK,EX5_2CHAN,"","","");    rewind_file_compare(EX1_10_SHORTEN,EX1_10,"","","");    rewind_file_compare(EX1_10_WAVPACK,EX1_10,"","","");    rewind_file_compare(EX1_10_SHORTPACK,EX1_10,"","","");    fprintf(spfp,"---- Rewind with data_mode modifications\n");    rewind_file_compare(EX5_2CHAN,EX5_CHAN12,"CH-1+2","","");    if (get_natural_sbf(2) == SP_sbf_10){	rewind_file_compare(EX1_01,EX1_10,"SBF-10","","");	rewind_file_compare(EX1_01_SHORTEN,EX1_10,"SBF-10","","");    } else {	rewind_file_compare(EX1_10,EX1_10,"SBF-01","","");	rewind_file_compare(EX1_10_SHORTEN,EX1_10,"SBF-01","","");    }    fprintf(spfp,"---- Rewind with 2 data_mode modifications\n");    if (get_natural_sbf(2) == SP_sbf_10){	rewind_file_compare(EX1_01,EX1_10,"SBF-10",EX4_ULAW,"SE-ULAW");	rewind_file_compare(EX1_01,EX4_ULAW,"SE-ULAW",EX1_10,"SBF-10");	rewind_file_compare(EX1_01_SHORTEN,EX4_ULAW,"SE-ULAW",EX1_10,"SBF-10");    } else {	rewind_file_compare(EX1_10,EX1_10,"SBF-01",EX4_ULAW,"SE-ULAW");	rewind_file_compare(EX1_10,EX4_ULAW,"SE-ULAW",EX1_10,"SBF-01");	rewind_file_compare(EX1_10_SHORTEN,EX4_ULAW,"SE-ULAW",EX1_10,"SBF-01");    }    rewind_file_compare(EX5_2CHAN,EX5_CHAN12,"CH-1+2",EX5_2CHAN,			"SE-ORIG:CH-1,2");    rewind_file_compare(EX5_2CHAN_SHORTEN,EX5_CHAN12,"CH-1+2",EX5_2CHAN,			"SE-ULAW:CH-1,2");    rewind_file_compare(EX5_2CHAN,EX5_2CHAN,"",EX5_CHAN12,"CH-1+2");    fprintf(spfp,"---- Rewind of multi channel file\n");    rewind_file_multi_channel(EX5_2CHAN,"",EX5_CHAN1,EX5_CHAN2);     rewind_file_multi_channel(EX5_2CHAN_PCM,"",EX5_CHAN1_PCM,EX5_CHAN2_PCM);    rewind_file_multi_channel(EX5_2CHAN,"SE-PCM:",EX5_CHAN1_PCM,			      EX5_CHAN2_PCM);     rewind_file_multi_channel(EX5_2CHAN_SHORTEN,"SE-PCM:",EX5_CHAN1_PCM,			      EX5_CHAN2_PCM);     rewind_file_multi_channel(EX5_2CHAN_WAVPACK,"SE-PCM:",EX5_CHAN1_PCM,			      EX5_CHAN2_PCM);     fprintf(spfp,"\n");}void rewind_file_multi_channel(char *file1, char *conv, char *file2, char *file3){    SP_FILE *sp1, *sp2, *sp3, *sp4;    char dm[50];        fprintf(spfp,"------ Comparing file '%s' converted by '%s'\n",file1,conv);    fprintf(spfp,"-------- Chan1 '%s' and Chan2 '%s':\n",file2,file3);        if ((sp1=sp_open(file1,"r")) == SPNULL) {	fprintf(spfp,"   sp_open: spopen failed on file '%s'\n",file1);	sp_print_return_status(spfp);	goto FATAL_QUIT;    }    if ((sp4=sp_open(file1,"r")) == SPNULL) {	fprintf(spfp,"   sp_open: spopen failed on file '%s'\n",file1);	sp_print_return_status(spfp);	goto FATAL_QUIT;    }    if ((sp2=sp_open(file2,"r")) == SPNULL) {	fprintf(spfp,"   spopen failed on file '%s'\n",file2);	sp_print_return_status(spfp);	goto FATAL_QUIT;    }    sprintf(dm,"%sCH-1",conv);    if (sp_set_data_mode(sp1,dm) != 0){	fprintf(spfp,"Error: sp_set_data_mode to ");	fprintf(spfp,"'CH-1' failed on file '%s'\n",file1);	sp_print_return_status(spfp);	goto FATAL_QUIT;    }    if (diff_SP_FILE_waveforms(sp1, sp2, file1, file2, TRUE, stderr) > 0){	fprintf(spfp,"Error: Waveforms differ on channel 1 compare\n");	goto FATAL_QUIT;    }    if ((sp3=sp_open(file3,"r")) == SPNULL) {	fprintf(spfp,"   spopen failed on file '%s'\n",file3);	sp_print_return_status(spfp);	goto FATAL_QUIT;    }    if (sp_rewind(sp1) > 0){	fprintf(spfp,"   sp_rewind failed on file '%s'\n",file1);	sp_print_return_status(spfp);	goto FATAL_QUIT;    }    sprintf(dm,"%sCH-2",conv);    if (sp_set_data_mode(sp1,dm) != 0){	fprintf(spfp,"Error: sp_set_data_mode to ");	fprintf(spfp,"'CH-2' failed on '%s'\n",file1);	sp_print_return_status(spfp);	goto FATAL_QUIT;    }    if (diff_SP_FILE_waveforms(sp1, sp3, file1, file3, TRUE, stderr) > 0){	fprintf(spfp,		"Error: Waveforms differ on channel 2 compare after rewind\n");	goto FATAL_QUIT;    }    if (sp_rewind(sp1) > 0){	fprintf(spfp,"   sp_rewind failed on file '%s'\n",file1);	sp_print_return_status(spfp);	goto FATAL_QUIT;    }    sprintf(dm,"CH-1,2");    if (sp_set_data_mode(sp1,dm) != 0){	fprintf(spfp,"Error: sp_set_data_mode to '%s' failed on '%s'\n",		dm,file1);	sp_print_return_status(spfp);	goto FATAL_QUIT;    }    if (diff_SP_FILE_waveforms(sp1, sp4, file1, file1, TRUE, stderr) > 0){	fprintf(spfp,"Error: Waveform differs when compared to itself\n");	goto FATAL_QUIT;    }    goto CLEAN_UP;  FATAL_QUIT:    exit(1);  CLEAN_UP:    if (sp1 != SPNULL) sp_close(sp1);    if (sp2 != SPNULL) sp_close(sp2);    if (sp3 != SPNULL) sp_close(sp3);    if (sp4 != SPNULL) sp_close(sp4);    return;}void rewind_file_compare(char *file1, char *file2, char *conv2, char *file3, char *conv3){    SP_FILE *sp1, *sp2;    char *cfile, *cconv;    int limit = 1 + ((strcmp(file3,"") == 0) ? 0 : 1), i;    fprintf(spfp,"------ Comparing file '%s' (converted by '%s') to "		"'%s':\n",file1,conv2,file2);    /* open file 1 only once */    if ((sp1=sp_open(file1,"r")) == SPNULL) {	fprintf(spfp,"   sp_open: spopen failed on file '%s'\n",file1);	sp_print_return_status(spfp);	goto FATAL_QUIT;    }    for (i=0; i<limit; i++){        if (i == 1)	    fprintf(spfp,"------       AND file '%s' (converted by '%s') to "		    "'%s':\n",file1,conv3,file3);	switch (i){	  case 0:	    cfile = file2; cconv = conv2; break;	  case 1: 	    cfile = file3; cconv = conv3; break;	  default:	    fprintf(spfp,"Error: undefined limit\n");	    goto FATAL_QUIT;	}	if ((sp2=sp_open(cfile,"r")) == SPNULL) {	    fprintf(spfp,"   spopen failed on file '%s'\n",cfile);	    sp_print_return_status(spfp);	    goto FATAL_QUIT;	}	if (sp_set_data_mode(sp1,cconv) != 0){	    fprintf(spfp,"Error: first sp_set_data_mode to ");	    fprintf(spfp,"'%s' failed on file '%s'\n",cconv,file1);	    sp_print_return_status(spfp);	    goto FATAL_QUIT;	}	if (diff_SP_FILE_waveforms(sp1, sp2, file1,cfile,TRUE,stderr) > 0){	    fprintf(spfp,"Error: Waveforms differ on initial compare\n");	    goto FATAL_QUIT;	}	sp_close(sp2); sp2 = SPNULL;	if ((sp2=sp_open(cfile,"r")) == SPNULL) {	    fprintf(spfp,"   spopen failed on file '%s'\n",cfile);	    sp_print_return_status(spfp);	    goto FATAL_QUIT;	}	if (sp_rewind(sp1) > 0){	    fprintf(spfp,"   first sp_rewind failed on file '%s'\n",file1);	    sp_print_return_status(spfp);	    goto FATAL_QUIT;	}	if (sp_set_data_mode(sp1,cconv) != 0){	    fprintf(spfp,"Error: second sp_set_data_mode to ");	    fprintf(spfp,"'%s' failed on file '%s'\n",cconv,file1);	    sp_print_return_status(spfp);	    goto FATAL_QUIT;	}	if (diff_SP_FILE_waveforms(sp1, sp2, file1, cfile, TRUE, stderr) > 0){	    fprintf(spfp,"Error: Waveforms differ on compare after rewind\n");	    goto FATAL_QUIT;	}	sp_close(sp2); sp2 = SPNULL;	if (sp_rewind(sp1) > 0){	    fprintf(spfp,"   second sp_rewind failed on file '%s'\n",file1);	    sp_print_return_status(spfp);	    goto FATAL_QUIT;	}    }    goto CLEAN_UP;  FATAL_QUIT:    exit(1);  CLEAN_UP:    if (sp1 != SPNULL) sp_close(sp1);    if (sp2 != SPNULL) sp_close(sp2);    return;}void build_example_file_names(char *sphere_lib_dir){    sprintf(EX1_10, "%s/%s", sphere_lib_dir,EX1_10_BASE);    sprintf(EX1_10_CORRUPT, "%s/%s", sphere_lib_dir,EX1_10_CORRUPT_BASE);    sprintf(EX1_01, "%s/%s", sphere_lib_dir,EX1_01_BASE);    sprintf(EX1_10_WAVPACK, "%s/%s", sphere_lib_dir, EX1_10_WAVPACK_BASE);    sprintf(EX1_10_SHORTEN, "%s/%s", sphere_lib_dir, EX1_10_SHORTEN_BASE);    sprintf(EX1_10_SHORTEN_CORRUPT, "%s/%s", sphere_lib_dir, EX1_10_SHORTEN_CORRUPT_BASE);    sprintf(EX1_10_SHORTPACK, "%s/%s", sphere_lib_dir, EX1_10_SHORTPACK_BASE);    sprintf(EX1_01_WAVPACK, "%s/%s", sphere_lib_dir, EX1_01_WAVPACK_BASE);    sprintf(EX1_01_SHORTEN, "%s/%s", sphere_lib_dir, EX1_01_SHORTEN_BASE);    sprintf(EX1_01_SHORTPACK, "%s/%s", sphere_lib_dir, EX1_01_SHORTPACK_BASE);    sprintf(EX2_10, "%s/%s", sphere_lib_dir,EX2_10_BASE);    sprintf(EX2_10_WAVPACK, "%s/%s", sphere_lib_dir, EX2_10_WAVPACK_BASE);    sprintf(EX2_10_SHORTEN, "%s/%s", sphere_lib_dir, EX2_10_SHORTEN_BASE);    sprintf(EX2_01, "%s/%s", sphere_lib_dir,EX2_01_BASE);    sprintf(EX2_01_WAVPACK, "%s/%s", sphere_lib_dir, EX2_01_WAVPACK_BASE);    sprintf(EX2_01_SHORTEN, "%s/%s", sphere_lib_dir, EX2_01_SHORTEN_BASE);    sprintf(EX4_ULAW, "%s/%s", sphere_lib_dir,EX4_ULAW_BASE);    sprintf(EX4_ULAW_WAVPACK, "%s/%s", sphere_lib_dir, EX4_ULAW_WAVPACK_BASE);    sprintf(EX4_ULAW_SHORTEN, "%s/%s", sphere_lib_dir, EX4_ULAW_SHORTEN_BASE);    sprintf(EX4_ULAW_10, "%s/%s", sphere_lib_dir,EX4_ULAW_10_BASE);    sprintf(EX4_ULAW_01, "%s/%s", sphere_lib_dir,EX4_ULAW_01_BASE);    sprintf(EX5_2CHAN, "%s/%s", sphere_lib_dir,EX5_ULAW_2CHAN_BASE);    sprintf(EX5_2CHAN_PCM, "%s/%s", sphere_lib_dir, EX5_ULAW_2CHAN_PCM_BASE);    sprintf(EX5_2CHAN_PCM_01, "%s/%s", sphere_lib_dir,	    EX5_ULAW_2CHAN_PCM_01_BASE);    sprintf(EX5_2CHAN_PCM_SHORTEN, "%s/%s", sphere_lib_dir,	    EX5_ULAW_2CHAN_PCM_SHORTEN_BASE);    sprintf(EX5_2CHAN_PCM_WAVPACK, "%s/%s", sphere_lib_dir,	    EX5_ULAW_2CHAN_PCM_WAVPACK_BASE);    sprintf(EX5_2CHAN_WAVPACK, "%s/%s", sphere_lib_dir,	    EX5_ULAW_2CHAN_WAVPACK_BASE);    sprintf(EX5_2CHAN_SHORTEN, "%s/%s", sphere_lib_dir,	    EX5_ULAW_2CHAN_SHORTEN_BASE);     sprintf(EX5_CHAN1, "%s/%s", sphere_lib_dir,EX5_ULAW_CHAN1_BASE);    sprintf(EX5_CHAN1_BITREV, "%s/%s", sphere_lib_dir,	    EX5_ULAW_CHAN1_BITREV_BASE);    sprintf(EX5_CHAN1_PCM, "%s/%s", sphere_lib_dir,	    EX5_ULAW_CHAN1_PCM_BASE);    sprintf(EX5_CHAN2, "%s/%s", sphere_lib_dir,EX5_ULAW_CHAN2_BASE);    sprintf(EX5_CHAN2_BITREV, "%s/%s", sphere_lib_dir,	    EX5_ULAW_CHAN2_BITREV_BASE);    sprintf(EX5_CHAN2_PCM, "%s/%s", sphere_lib_dir,	    EX5_ULAW_CHAN2_PCM_BASE);    sprintf(EX5_CHAN12, "%s/%s", sphere_lib_dir,EX5_ULAW_CHAN12_BASE);    sprintf(EX5_CHAN12_PCM, "%s/%s", sphere_lib_dir,	    EX5_ULAW_CHAN12_PCM_BASE);    sprintf(EX6, "%s/%s", sphere_lib_dir,EX6_BASE);    sprintf(EX7_PCULAW, "%s/%s", sphere_lib_dir,EX7_PCULAW_BASE);    sprintf(EX7_PCULAW_WAVPACK, "%s/%s", sphere_lib_dir, EX7_PCULAW_WAVPACK_BASE);    sprintf(EX7_PCULAW_SHORTEN, "%s/%s", sphere_lib_dir, EX7_PCULAW_SHORTEN_BASE);    sprintf(EX7_PCULAW_10, "%s/%s", sphere_lib_dir,EX7_PCULAW_10_BASE);    sprintf(EX7_PCULAW_01, "%s/%s", sphere_lib_dir,EX7_PCULAW_01_BASE);}int verify_checksum_computations(int test){    char *proc="check_checksum " SPHERE_VERSION_STR;    SP_CHECKSUM comp_chksm, comp_chksm1, sum_chksm;    static SP_CHECKSUM ex_arr[100] = { 0, 17, 51, 102, 170, 255, 357, 476,	612, 765, 935, 1122, 1326, 1547, 1785, 2040, 2312, 2601, 2907,	3230, 3570, 3927, 4301, 4692, 5100, 5525, 5967, 6426, 6902,	7395, 7905, 8432, 8976, 9537, 10115, 10710, 11322, 11951,	12597, 13260, 13940, 14637, 15351, 16082, 16830, 17595, 18377,	19176, 19992, 20825, 21675, 22542, 23426, 24327, 25245, 26180,	27132, 28101, 29087, 30090, 31110, 32147, 33201, 34272, 35360,	36465, 37587, 38726, 39882, 41055, 42245, 43452, 44676, 45917,	47175, 48450, 49742, 51051, 52377, 53720, 55080, 56457, 57851,

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?