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