⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spclose.c

📁 speech signal process tools
💻 C
📖 第 1 页 / 共 2 页
字号:
		lint = (SP_INTEGER) spifr->waveform->samples_written;		spifr->status->file_sample_count = lint;		/* temporarily reset the write occured flag to allow header  */		/* modifications */		w_spstat->write_occured_flag = FALSE;		if (sp_h_set_field(sp,SAMPLE_COUNT_FIELD,T_INTEGER,&lint) !=0){		    if (write_name != CNULL) mtrf_free(write_name);		    if (read_name != CNULL) mtrf_free(read_name);		    free_sphere_t(sp);		    return_err(proc,200,200,"Unable to update sample_count");		}		/* Reset the write occured flag */		w_spstat->write_occured_flag = TRUE;		header_changed = TRUE;	    }	    if (h_get_field(spifr->status->file_header,SAMPLE_CHECKSUM_FIELD,			    T_INTEGER,(void *)&lint) != 0){		if (write_name != CNULL) mtrf_free(write_name);		if (read_name != CNULL) mtrf_free(read_name);		free_sphere_t(sp);		return_err(proc,201,201,			   "Unable to get sample_checksum for file on disk");	    }	    if (lint != spifr->status->file_checksum) {		/* then the checksum was just computed, so install it */		lint = (SP_INTEGER)spifr->waveform->checksum;		/* temporarily reset the write occured flag to allow header  */		/* modifications */		w_spstat->write_occured_flag = FALSE;		if (sp_h_set_field(sp,SAMPLE_CHECKSUM_FIELD,				   T_INTEGER,&lint) >= 100){		    if (write_name != CNULL) mtrf_free(write_name);		    if (read_name != CNULL) mtrf_free(read_name);		    free_sphere_t(sp);		    return_err(proc,202,202,"Unable to update checksum");		}		/* Reset the write occured flag */		w_spstat->write_occured_flag = TRUE;		header_changed = TRUE;	    } else 		if (lint != spifr->waveform->checksum) {		    spifr->waveform->failed_checksum = TRUE;	    		    if (write_name != CNULL) mtrf_free(write_name);		    if (read_name != CNULL) mtrf_free(read_name);		    free_sphere_t(sp);		  return_err(proc,203,203,		    rsprintf("Write verification of checksum failed on file %s",			     spifr->status->external_filename));		}	}	/* flush the updated header to the file  */	if (header_changed) {	    FILE *fp;	    if (! spifr->status->is_disk_file) {		if (write_name != CNULL) mtrf_free(write_name);		if (read_name != CNULL) mtrf_free(read_name);		free_sphere_t(sp);		return_err(proc,301,301,		   "Internal Error, header changed size on write to stdout");	    }	    fp = ((spifr->waveform->sp_fp != FPNULL) ? 		  (spifr->waveform->sp_fp) : 		  ((spifr->waveform->sp_fob->fp != FPNULL) ?		   (spifr->waveform->sp_fob->fp) : FPNULL));	    if (fp == FPNULL) {		if (write_name != CNULL) mtrf_free(write_name);		if (read_name != CNULL) mtrf_free(read_name);		free_sphere_t(sp);		return_err(proc,300,300,"Internal Error");	    }	    rewind(fp);	    if (sp_write_header(fp,spifr->status->file_header,				&header_size,&data_size) < 0) {		if (write_name != CNULL) mtrf_free(write_name);		if (read_name != CNULL) mtrf_free(read_name);				free_sphere_t(sp);		return_err(proc,204,204,"Unable to update header in file");	    }        }		if ((spifr->status->is_temp_file == FALSE) &&	    fob_is_fp(spifr->waveform->sp_fob)) { 	    /* check to make sure the blocking has not changed */	    if (header_changed)		if (((data_size + PAD_MULT) / PAD_MULT) !=		    ((spifr->waveform->header_data_size + PAD_MULT) /PAD_MULT)){		    if (write_name != CNULL) mtrf_free(write_name);		    if (read_name != CNULL) mtrf_free(read_name);		    free_sphere_t(sp);		    return_err(proc,205,205,			       "Header size has changed on update");    		}	} else {	    if (spifr->status->user_compress == spifr->status->file_compress){		if (fob_flush_to_fp(spifr->waveform->sp_fob,				    spifr->waveform->sp_fp) != 0){		    if (write_name != CNULL) mtrf_free(write_name);		    if (read_name != CNULL) mtrf_free(read_name);		    free_sphere_t(sp);		    return_err(proc,206,206,"Unable to flush data to disk");		}	    } else { /* do some compression */		FOB *comp_fob;		/* 1. rewind the data */		/* 2. alloc FOB to compress into */		/* 3. compress the file */		/* 4. free the allocated FOB */		fob_rewind(spifr->waveform->sp_fob);		if  ((comp_fob = fob_create(spifr->waveform->sp_fp)) ==		     FOBPNULL) {		    if (write_name != CNULL) mtrf_free(write_name);		    if (read_name != CNULL) mtrf_free(read_name);		    free_sphere_t(sp);		    return_err(proc,207,207,"Unable to setup for compression");		}		spifr->waveform->sp_fp = FPNULL;		switch (spifr->status->file_compress){                  char message[70];		  case SP_wc_shorten:		    /* optimize the compression */		   shorten_set_channel_count(spifr->status->file_channel_count);		    if (spifr->status->file_encoding == SP_se_ulaw)			shorten_set_ftype("au");		    else if (spifr->status->file_encoding == SP_se_pcm1)			shorten_set_ftype("s8");		    else if (spifr->status->file_encoding == SP_se_pcm2)			if (spifr->status->file_sbf == SP_sbf_01)			    shorten_set_ftype("s16lh");			else			    shorten_set_ftype("s16hl");		    if (sp_verbose > 15) shorten_dump_flags(spfp);  	            if(setjmp(exitenv) == 0){			if (shorten_compress(spifr->waveform->sp_fob, 					     comp_fob, message) < 0){			    fob_destroy(comp_fob);			    if (write_name != CNULL) mtrf_free(write_name);			    if (read_name != CNULL) mtrf_free(read_name);			    free_sphere_t(sp);			    return_err(proc,208,208,				  rsprintf("Shorten Compression Failed - %s",					   message));			}		    } else			return_err(proc,213,0,"Shorten Compression Aborted");		  		    fob_fflush(comp_fob);		    break;		  case SP_wc_wavpack:		    if(setjmp(exitenv) == 0){			/* optimize the compression */			wavpack_set_progname( "wavpack" );			if (spifr->status->file_channel_count == 1)			    wavpack_set_monoflg(TRUE);			else			    wavpack_set_monoflg(FALSE);			wavpack_set_byteflg(spifr->status->file_sbf ==SP_sbf_1);			if (sp_verbose > 15) wavpack_dump_interface(spfp);			if (wavpack_pack(spifr->waveform->sp_fob, comp_fob)<0){			    fob_destroy(comp_fob);			    if (write_name != CNULL) mtrf_free(write_name);			    if (read_name != CNULL) mtrf_free(read_name);			    free_sphere_t(sp);			    return_err(proc,209,209,				       "Wavpack Compression Failed");			}			wavpack_free_progname();			fob_fflush(comp_fob);		    } else {			return_err(proc,212,0,"Wavpack Compression Aborted");		    }		    break;		  case SP_wc_shortpack:		    return_err(proc,211,211,			       "Unable to Compress using shortpack\n");		  default:		    if (write_name != CNULL) mtrf_free(write_name);		    if (read_name != CNULL) mtrf_free(read_name);		    free_sphere_t(sp);		    return_err(proc,210,210,			       "Unable to Compress the requested format\n");		}		spifr->waveform->sp_fp = comp_fob->fp;		fob_destroy(comp_fob);	    }	}	if ((sp->open_mode == SP_mode_write) ||	    (sp->open_mode == SP_mode_update))	    if (w_spstat->extra_checksum_verify)		verify_checksum = TRUE;    }    free_sphere_t(sp);    /*************************************************/    /* The file is now completely written and closed */    /*************************************************/    /**************************************************/    /*  If the write verification is requested, do it */    if (verify_checksum) {	if (strsame(write_name,"-")) {	    if (write_name != CNULL) mtrf_free(write_name);	    if (read_name != CNULL) mtrf_free(read_name);	    return_warn(proc,1,1,			"Unable to verify checksum, file went to STDOUT");	}	if (verify_file_checksum(write_name) != 0){	    sp_print_return_status(spfp);	    if (write_name != CNULL) mtrf_free(write_name);	    if (read_name != CNULL) mtrf_free(read_name);	    return_err(proc,1000,1000,		       "Read Verification of written file failed");	}    }    if (write_name != CNULL) mtrf_free(write_name);    if (read_name != CNULL) mtrf_free(read_name);    return_success(proc,0,0,"ok");}int verify_file_checksum(char *filename){    char *proc="verify_file_checksum " SPHERE_VERSION_STR;    SP_FILE *sp;    char buf[1024];    if (sp_verbose > 10) fprintf(spfp,"Proc %s:\n",proc);    if (filename == CNULL) return_err(proc,100,100,"Null filename");        if ((sp = sp_open(filename,"rv")) == SPNULL)        return_err(proc,101,101,		   rsprintf("Unable to open SPHERE file '%s'",filename));    if (sp->read_spifr->status->user_sample_count > 0){	if (sp_read_data(buf,1,sp) != 1){	    sp_close(sp);	    return_err(proc,200,200,"Verification of checksum failed");	}    } else {	sp_close(sp);	return_err(proc,300,300,"No data in file to check");    }	    sp_close(sp);    if (sp_verbose > 11) fprintf(spfp,"Proc %s: Returning 0\n",proc);    return_success(proc,0,0,"Checksum verification passed");}

⌨️ 快捷键说明

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