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