spopen.c

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

C
888
字号
/**** This function is exempt from the requirement of using spfp ****/void spifr_dump(SPIFR *spifr, FILE *fp){    fprintf(fp,"|------------------------------------------");    fprintf(fp,"-----------------------------\n|\n");    fprintf(fp,"Dump of an SP_FILE structure\n");    fprintf(fp,"Users file header\n");    sp_print_lines(spifr->header,fp);    fprintf(fp,"\n");    fprintf(fp,"Wave Sructure\n");    fprintf(fp,"File pointer:     %x\n",(unsigned)spifr->waveform->sp_fp);    fprintf(fp,"FOB pointer:      %x\n",(unsigned)spifr->waveform->sp_fob);    fprintf(fp,"Samples Read:     %d\n",spifr->waveform->samples_read);    fprintf(fp,"Samples written:  %d\n",spifr->waveform->samples_written);    fprintf(fp,"Checksum:         %d\n",spifr->waveform->checksum);    fprintf(fp,"Header Data Size: %ld\n",spifr->waveform->header_data_size);    fprintf(fp,"Read Pre-Mat. EOF %d\n",spifr->waveform->read_premature_eof);    fprintf(fp,"Failed Checksum   %d\n",spifr->waveform->failed_checksum);    fprintf(fp,"Waveform Setup    %d\n",spifr->waveform->waveform_setup);    fprintf(fp,"File Tran. Len    %d\n",	    spifr->waveform->file_data_buffer_len);    fprintf(fp,"File Tran. Buf.   %x\n",	    (unsigned)spifr->waveform->file_data_buffer);    fprintf(fp,"Code Tran. Len    %x\n",	    (unsigned)spifr->waveform->converted_buffer_len);    fprintf(fp,"Code Tran. Buf.   %x\n",	    (unsigned)spifr->waveform->converted_buffer);    fprintf(fp,"Interkleave Len   %d\n",	    spifr->waveform->interleave_buffer_len);    fprintf(fp,"Interleave Buf.   %x\n",	    (unsigned)spifr->waveform->interleave_buffer);        fprintf(fp,"\n");    fprintf(fp,"Status Structure\n");    fprintf(fp,"External file name:  %s\n",	    spifr->status->external_filename);    fprintf(fp,"The File header\n");    sp_print_lines(spifr->status->file_header,fp);    fprintf(fp,"Write Occured Flag:  %d\n",	    spifr->status->write_occured_flag);    fprintf(fp,"Read Occured Flag:   %d\n",	    spifr->status->read_occured_flag);    fprintf(fp,"Field Set Occ. Flag: %d\n",	    spifr->status->field_set_occured_flag);    fprintf(fp,"S_D_MODE Occ. Flg:   %d\n",	    spifr->status->set_data_mode_occured_flag);    fprintf(fp,"File checksum:       %d\n",	    spifr->status->file_checksum);       fprintf(fp,"Ignore checksum:     %d\n",	    spifr->status->ignore_checksum);       fprintf(fp,"Nat Sample Byte Fmt: %s\n",	    enum_str_SP_sample_byte_fmt(spifr->status->natural_sbf));    fprintf(fp,"Extra Checksum Check %d\n",	    spifr->status->extra_checksum_verify);    fprintf(fp,"Is Disk File         %d\n",spifr->status->is_disk_file);    fprintf(fp,"Is Temp File         %d\n",spifr->status->is_temp_file);    fprintf(fp,"Temp File Name       %s\n",spifr->status->temp_filename);    if (spifr->status->channels != CHANNELSNULL) {	int outc, orgc;	CHANNELS *Channels=spifr->status->channels;	fprintf(spfp,"Channel Structure:\n");	for (outc=0; outc<Channels->num_chan; outc++){	    fprintf(fp,"     Channel %d: #sources=%d ",		    outc,Channels->ochan[outc].num_origin);	    for (orgc=0; orgc < Channels->ochan[outc].num_origin; orgc++)		fprintf(fp," %s%d",(orgc >= 1) ? "+ " : "",		       Channels->ochan[outc].orig_channel[orgc]);	    fprintf(fp,"\n");	}	fprintf(fp,"\n");    }    fprintf(fp,"                                   USER");    fprintf(fp,"                    FILE\n");    fprintf(fp,"Channel count:    %22d  %22d\n",	    spifr->status->user_channel_count,	    spifr->status->file_channel_count);    fprintf(fp,"Sample Count:     %22d  %22d\n",	    spifr->status->user_sample_count,	    spifr->status->file_sample_count);    fprintf(fp,"Sample Rate:      %22d  %22d\n",	    spifr->status->user_sample_rate, 	    spifr->status->file_sample_rate);     fprintf(fp,"Sample N bytes:   %22d  %22d\n",           spifr->status->user_sample_n_bytes,	    spifr->status->file_sample_n_bytes);    fprintf(fp,"Sample Byte Fmt:  %22s  %22s\n",	    enum_str_SP_sample_byte_fmt(spifr->status->user_sbf),	    enum_str_SP_sample_byte_fmt(spifr->status->file_sbf));    fprintf(fp,"File Coding:      %22s  %22s\n",	    enum_str_SP_sample_encoding(spifr->status->user_encoding),	    enum_str_SP_sample_encoding(spifr->status->file_encoding));    fprintf(fp,"File Compress:    %22s  %22s\n",	    enum_str_SP_waveform_comp(spifr->status->user_compress),	    enum_str_SP_waveform_comp(spifr->status->file_compress));    fprintf(fp,"Data Format:      %22s\n",	    enum_str_SP_data_format(spifr->status->user_data_fmt));    fprintf(fp,"|\n|--------------------------------------");    fprintf(fp,"---------------------------------\n");}int sp_set_default_operations(SP_FILE *sp){    SP_INTEGER l_int;    char *str, *proc="sp_set_default_operations " SPHERE_VERSION_STR;    SPIFR *spifr;    int ret;    if (sp_verbose > 10) fprintf(spfp,"Proc %s:\n",proc);    if (sp == SPNULL) return_err(proc,100,100,"Null SPFILE pointer");    if ((sp->open_mode == SP_mode_read) || (sp->open_mode == SP_mode_update))        spifr = sp->read_spifr;    else if (sp->open_mode == SP_mode_write)        spifr = sp->write_spifr;    else        return_err(proc,100,100,"Unknown File Mode");    /**********************************************************************/    /*    The following fields are REQUIRED for Read operations,          */    /*                      NO Exceptions                                 */    if (sp_h_get_field(sp,SAMPLE_COUNT_FIELD,T_INTEGER,(void *)&l_int) != 0){	/* ----------  OLD CODE  ---------------------	       return_err(proc,101,101,rsprintf("Missing '%s' header field",	                                        SAMPLE_COUNT_FIELD));	    spifr->status->user_sample_count =		spifr->status->file_sample_count = (int)l_int;*/        /*  added a condition to permit a pipe to NOT have a sample_count */	/*  field.  ADDED June 22, 1993   */ 	if (spifr->status->is_disk_file){	    return_err(proc,101,101,rsprintf("Missing '%s' header field",					     SAMPLE_COUNT_FIELD));	} else { /* Sample counts may be missing from piped files */	    spifr->status->user_sample_count =		spifr->status->file_sample_count = 999999999;	    	}     } else	spifr->status->user_sample_count =	    spifr->status->file_sample_count = (int)l_int;    if (l_int <= 0)	return_err(proc,108,108,		   rsprintf("Field '%s' value out of range, %d <= 0",			    SAMPLE_COUNT_FIELD,l_int));    if (sp_h_get_field(sp,SAMPLE_N_BYTES_FIELD,		       T_INTEGER,(void *)&l_int) != 0)	return_err(proc,104,104,		   rsprintf("Missing '%s' header field",			    SAMPLE_N_BYTES_FIELD));    spifr->status->user_sample_n_bytes = 	spifr->status->file_sample_n_bytes = (int)l_int;    if (l_int <= 0)	return_err(proc,108,108,		   rsprintf("Field '%s' value out of range, %d <= 0",			    SAMPLE_N_BYTES_FIELD,l_int));    if (sp_h_get_field(sp,CHANNEL_COUNT_FIELD,T_INTEGER,(void *)&l_int) != 0)	return_err(proc,105,105,		   rsprintf("Missing '%s' header field",			    CHANNEL_COUNT_FIELD));    spifr->status->user_channel_count = spifr->status->file_channel_count =	(int)l_int;    if (l_int <= 0)	return_err(proc,108,108,		   rsprintf("Field '%s' value out of range, > 0",			    CHANNEL_COUNT_FIELD,l_int));    /**********************************************************************/    /* The following fields may exist, if they do not, there is a default */    /***** NOTE:  only set the file_sbf, Sp_set_data_mode is called to    */    /***** set the user_sbf                                               */    if ((ret=sp_h_get_field(sp,SAMPLE_BF_FIELD,T_STRING,(void *)&str)) != 0){	if ((spifr->status->file_sbf = 	     get_natural_sbf(spifr->status->user_sample_n_bytes)) == 	    SP_sbf_null)	    return_err(proc,107,107,		       rsprintf("Unable to read sample sizes of %d bytes",				spifr->status->user_sample_n_bytes));    } else {  /* str holds the sample_byte_format_value */	ret = parse_sample_byte_format(str,&(spifr->status->file_sbf));	if (ret == 1000) { 	    /* then the file was compressed using change_wav_format */	    spifr->status->file_sbf =		get_natural_sbf(spifr->status->user_sample_n_bytes);	    spifr->status->file_compress = SP_wc_shortpack;	    if ((h_set_field(spifr->header,SAMPLE_BF_FIELD,			     T_STRING,get_natural_byte_order(2)) != 0) ||		(h_set_field(spifr->status->file_header,SAMPLE_BF_FIELD,			     T_STRING,get_natural_byte_order(2)) != 0)){		sp_print_return_status(spfp);		mtrf_free(str);		return_err(proc,110,110,			   rsprintf("Unable to re-set sample byte format%s",				    "field for a shortpacked file"));	    }	    if ((h_set_field(spifr->header,SAMPLE_CODING_FIELD,T_STRING,			     rsprintf("pcm,embedded-%s",str)) != 0) ||		(h_set_field(spifr->status->file_header,SAMPLE_CODING_FIELD,			     T_STRING,rsprintf("pcm,embedded-%s",str)) !=0)){		sp_print_return_status(spfp);		mtrf_free(str);		return_err(proc,111,111,			   rsprintf("Unable to re-set sample coding field%s",				    "for a shortpacked file"));	    }	} else if (ret != 0) { /* there really was an error */	    mtrf_free(str);	    return_err(proc,106,106,		       "Unable to parse the 'sample_byte_format' field");	}	mtrf_free(str);    }              /***** field break *****/	        if (sp_h_get_field(sp,SAMPLE_CODING_FIELD,T_STRING,(void *)&str) != 0)	if (spifr->status->user_sample_n_bytes == 1)	    str = mtrf_strdup("ulaw");	else	    /* the default, since old Corpora are missing this field */	    str = mtrf_strdup("pcm");         if (parse_sample_coding(str,spifr->status->file_sample_n_bytes,			    &(spifr->status->file_encoding),			    &(spifr->status->file_compress)) != 0){	mtrf_free(str);	print_return_status(spfp);	return_err(proc,107,107,	   rsprintf("Unable to parse sample_coding value '%s' header field",			    str));    }    mtrf_free(str);    /*********************************************************************/    /*    The following fields are conditionally required.               */    ret = sp_h_get_field(sp,SAMPLE_RATE_FIELD,T_INTEGER,(void *)&l_int);    switch (spifr->status->file_encoding) {      case SP_se_pcm1:      case SP_se_pcm2:      case SP_se_ulaw:	if (ret != 0)	    return_err(proc,102,102,		       rsprintf("Header field '%s' missing, but required%s",				SAMPLE_RATE_FIELD," for waveform data"));	spifr->status->user_sample_rate = spifr->status->file_sample_rate =	    (int)l_int;	break;      case SP_se_pculaw:	if (ret != 0)	    return_err(proc,1022,1022,		       rsprintf("Header field '%s' missing, but required%s",				SAMPLE_RATE_FIELD," for waveform data"));	spifr->status->user_sample_rate = spifr->status->file_sample_rate =	    (int)l_int;	break;      case SP_se_alaw:	if (ret != 0)	    return_err(proc,1021,1021,		       rsprintf("Header field '%s' missing, but required%s",				SAMPLE_RATE_FIELD," for waveform data"));	spifr->status->user_sample_rate = spifr->status->file_sample_rate =	    (int)l_int;	break;      case SP_se_raw:      default:	spifr->status->user_sample_rate = spifr->status->file_sample_rate =0;    }	      /***********************************************************************/    /*    The following fields are OPTIONAL, but if they exist, there is a */    /*    special purpose for them                                         */    if (sp_h_get_field(sp,SAMPLE_CHECKSUM_FIELD,T_INTEGER,(void *)&l_int)==0)	spifr->status->file_checksum = l_int;    else {	spifr->status->ignore_checksum = TRUE;    }    /*********************/    /* Consitency checks */    /*********************/    if (spifr->status->file_encoding == SP_se_ulaw &&	spifr->status->file_sample_n_bytes != 1) 	return_err(proc,120,120,		   rsprintf("Ulaw encoding requires a 1 byte sample,%s %d",			    " however the header value is",			    spifr->status->file_sample_n_bytes));    if (spifr->status->file_encoding == SP_se_pculaw &&	spifr->status->file_sample_n_bytes != 1) 	return_err(proc,120,120,		   rsprintf("Pculaw encoding requires a 1 byte sample,%s %d",

⌨️ 快捷键说明

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