📄 wav.c
字号:
psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->ext.bytespersec, wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) ; else psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->ext.bytespersec) ; bytesread += psf_binheader_readf (psf, "wwl", &(wav_fmt->ext.extrabytes), &(wav_fmt->ext.validbits), &(wav_fmt->ext.channelmask)) ; psf_log_printf (psf, " Valid Bits : %d\n", wav_fmt->ext.validbits) ; psf_log_printf (psf, " Channel Mask : 0x%X\n", wav_fmt->ext.channelmask) ; bytesread += psf_binheader_readf (psf, "lww", &(wav_fmt->ext.esf.esf_field1), &(wav_fmt->ext.esf.esf_field2), &(wav_fmt->ext.esf.esf_field3)) ; psf_log_printf (psf, " Subformat\n") ; psf_log_printf (psf, " esf_field1 : 0x%X\n", wav_fmt->ext.esf.esf_field1) ; psf_log_printf (psf, " esf_field2 : 0x%X\n", wav_fmt->ext.esf.esf_field2) ; psf_log_printf (psf, " esf_field3 : 0x%X\n", wav_fmt->ext.esf.esf_field3) ; psf_log_printf (psf, " esf_field4 : ") ; for (k = 0 ; k < 8 ; k++) { bytesread += psf_binheader_readf (psf, "c", &(wav_fmt->ext.esf.esf_field4 [k])) ; psf_log_printf (psf, "0x%X ", wav_fmt->ext.esf.esf_field4 [k] & 0xFF) ; } ; psf_log_printf (psf, "\n") ; psf->sf.pcmbitwidth = wav_fmt->ext.bitwidth ; psf->bytewidth = BITWIDTH2BYTES (wav_fmt->ext.bitwidth) ; break ; default : break ; } ; if (bytesread > structsize) { psf_log_printf (psf, "*** read_fmt_chunk (bytesread > structsize)\n") ; return SFE_WAV_FMT_SHORT ; } else fread (psf->buffer, 1, structsize - bytesread, psf->file) ; psf->blockwidth = wav_fmt->min.channels * psf->bytewidth ; return 0 ;} /* read_fmt_chunk */static int wav_write_header (SF_PRIVATE *psf){ unsigned int fmt_size ; int k, error, subformat ; /* Reset the current header length to zero. */ psf->header [0] = 0 ; psf->headindex = 0 ; fseek (psf->file, 0, SEEK_SET) ; /* RIFF marker, length, WAVE and 'fmt ' markers. */ psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ; subformat = psf->sf.format & SF_FORMAT_SUBMASK ; switch (subformat) { case SF_FORMAT_PCM : psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_PCM) ; if (psf->bytewidth == 1) psf->chars = SF_CHARS_UNSIGNED ; if ((error = pcm_write_init (psf))) return error ; fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ; /* fmt : format, channels, samplerate */ psf_binheader_writef (psf, "lwwl", fmt_size, WAVE_FORMAT_PCM, psf->sf.channels, psf->sf.samplerate) ; /* fmt : bytespersec */ psf_binheader_writef (psf, "l", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; /* fmt : blockalign, bitwidth */ psf_binheader_writef (psf, "ww", psf->bytewidth * psf->sf.channels, psf->sf.pcmbitwidth) ; break ; case SF_FORMAT_FLOAT : psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_FLOAT) ; /* Add the peak chunk to floating point files. */ psf->has_peak = SF_TRUE ; psf->peak_loc = SF_PEAK_START ; float32_write_init (psf) ; fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ; /* fmt : format, channels, samplerate */ psf_binheader_writef (psf, "lwwl", fmt_size, WAVE_FORMAT_IEEE_FLOAT, psf->sf.channels, psf->sf.samplerate) ; /* fmt : bytespersec */ psf_binheader_writef (psf, "l", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; /* fmt : blockalign, bitwidth */ psf_binheader_writef (psf, "ww", psf->bytewidth * psf->sf.channels, psf->sf.pcmbitwidth) ; /* Write 'fact' chunk. */ psf_binheader_writef (psf, "mll", fact_MARKER, FACT_CHUNK_SIZE, psf->sf.samples) ; break ; case SF_FORMAT_ULAW : psf->sf.format = (SF_FORMAT_WAV | subformat) ; ulaw_write_init (psf) ;/* fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ; */ /* bko: change this to conform to more "standard" wav files */ fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 ; /* fmt : format, channels, samplerate */ psf_binheader_writef (psf, "lwwl", fmt_size, WAVE_FORMAT_MULAW, psf->sf.channels, psf->sf.samplerate) ; /* fmt : bytespersec */ psf_binheader_writef (psf, "l", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; /* fmt : blockalign, bitwidth, extrabytes, dummy */ psf_binheader_writef (psf, "www", psf->bytewidth * psf->sf.channels, 8, 0) ; /* Write 'fact' chunk. */ psf_binheader_writef (psf, "mll", fact_MARKER, FACT_CHUNK_SIZE, psf->sf.samples) ; break ; case SF_FORMAT_ALAW : psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ALAW) ; alaw_write_init (psf) ; fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ; /* fmt : format, channels, samplerate */ psf_binheader_writef (psf, "lwwl", fmt_size, WAVE_FORMAT_ALAW, psf->sf.channels, psf->sf.samplerate) ; /* fmt : bytespersec */ psf_binheader_writef (psf, "l", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ; /* fmt : blockalign, bitwidth, extrabytes, dummy */ psf_binheader_writef (psf, "wwww", psf->bytewidth * psf->sf.channels, 8, 2, 0) ; /* Write 'fact' chunk. */ psf_binheader_writef (psf, "mll", fact_MARKER, FACT_CHUNK_SIZE, psf->sf.samples) ; break ; case SF_FORMAT_IMA_ADPCM : psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM) ; if ((error = wav_ima_writer_init (psf))) return error ; /* File header was fully written in wav_ima_writer_init () so return. */ return 0 ; break ; case SF_FORMAT_MS_ADPCM : psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM) ; if ((error = wav_msadpcm_writer_init (psf))) return error ; /* File header was fully written in wav_wav_msadpcm_writer_init () so return. */ return 0 ; break ; case SF_FORMAT_GSM610 : psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_GSM610) ; if ((error = wav_gsm610_writer_init (psf))) return error ; /* File header was fully written in wav_gsm610_writer_init () so return. */ return 0 ; break ; default : return SFE_UNIMPLEMENTED ; } ; if (psf->has_peak && psf->peak_loc == SF_PEAK_START) { psf_binheader_writef (psf, "ml", PEAK_MARKER, sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ; psf_binheader_writef (psf, "ll", 1, time (NULL)) ; for (k = 0 ; k < psf->sf.channels ; k++) psf_binheader_writef (psf, "fl", psf->peak.peak[k].value, psf->peak.peak[k].position) ; } ; psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ; fwrite (psf->header, psf->headindex, 1, psf->file) ; psf->dataoffset = psf->headindex ; return 0 ;} /* wav_write_header */static int wav_write_tailer (SF_PRIVATE *psf){ int k ; /* Reset the current header buffer length to zero. */ psf->header [0] = 0 ; psf->headindex = 0 ; fseek (psf->file, 0, SEEK_END) ; if (psf->has_peak && psf->peak_loc == SF_PEAK_END) { psf_binheader_writef (psf, "ml", PEAK_MARKER, sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ; psf_binheader_writef (psf, "ll", 1, time (NULL)) ; for (k = 0 ; k < psf->sf.channels ; k++) psf_binheader_writef (psf, "fl", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */ } ; if (psf->headindex > 0) fwrite (psf->header, psf->headindex, 1, psf->file) ; return 0 ;} /* wav_write_tailer */static char const* wav_format_str (int k){ switch (k) { case WAVE_FORMAT_UNKNOWN : return "WAVE_FORMAT_UNKNOWN" ; case WAVE_FORMAT_PCM : return "WAVE_FORMAT_PCM " ; case WAVE_FORMAT_MS_ADPCM : return "WAVE_FORMAT_MS_ADPCM" ; case WAVE_FORMAT_IEEE_FLOAT : return "WAVE_FORMAT_IEEE_FLOAT" ; case WAVE_FORMAT_IBM_CVSD : return "WAVE_FORMAT_IBM_CVSD" ; case WAVE_FORMAT_ALAW : return "WAVE_FORMAT_ALAW" ; case WAVE_FORMAT_MULAW : return "WAVE_FORMAT_MULAW" ; case WAVE_FORMAT_OKI_ADPCM : return "WAVE_FORMAT_OKI_ADPCM" ; case WAVE_FORMAT_IMA_ADPCM : return "WAVE_FORMAT_IMA_ADPCM" ; case WAVE_FORMAT_MEDIASPACE_ADPCM : return "WAVE_FORMAT_MEDIASPACE_ADPCM" ; case WAVE_FORMAT_SIERRA_ADPCM : return "WAVE_FORMAT_SIERRA_ADPCM" ; case WAVE_FORMAT_G723_ADPCM : return "WAVE_FORMAT_G723_ADPCM" ; case WAVE_FORMAT_DIGISTD : return "WAVE_FORMAT_DIGISTD" ; case WAVE_FORMAT_DIGIFIX : return "WAVE_FORMAT_DIGIFIX" ; case WAVE_FORMAT_DIALOGIC_OKI_ADPCM : return "WAVE_FORMAT_DIALOGIC_OKI_ADPCM" ; case WAVE_FORMAT_MEDIAVISION_ADPCM : return "WAVE_FORMAT_MEDIAVISION_ADPCM" ; case WAVE_FORMAT_YAMAHA_ADPCM : return "WAVE_FORMAT_YAMAHA_ADPCM" ; case WAVE_FORMAT_SONARC : return "WAVE_FORMAT_SONARC" ; case WAVE_FORMAT_DSPGROUP_TRUESPEECH : return "WAVE_FORMAT_DSPGROUP_TRUESPEECH " ; case WAVE_FORMAT_ECHOSC1 : return "WAVE_FORMAT_ECHOSC1" ; case WAVE_FORMAT_AUDIOFILE_AF18 : return "WAVE_FORMAT_AUDIOFILE_AF18 " ; case WAVE_FORMAT_APTX : return "WAVE_FORMAT_APTX" ; case WAVE_FORMAT_AUDIOFILE_AF10 : return "WAVE_FORMAT_AUDIOFILE_AF10 " ; case WAVE_FORMAT_DOLBY_AC2 : return "WAVE_FORMAT_DOLBY_AC2" ; case WAVE_FORMAT_GSM610 : return "WAVE_FORMAT_GSM610" ; case WAVE_FORMAT_MSNAUDIO : return "WAVE_FORMAT_MSNAUDIO" ; case WAVE_FORMAT_ANTEX_ADPCME : return "WAVE_FORMAT_ANTEX_ADPCME" ; case WAVE_FORMAT_CONTROL_RES_VQLPC : return "WAVE_FORMAT_CONTROL_RES_VQLPC" ; case WAVE_FORMAT_DIGIREAL : return "WAVE_FORMAT_DIGIREAL" ; case WAVE_FORMAT_DIGIADPCM : return "WAVE_FORMAT_DIGIADPCM" ; case WAVE_FORMAT_CONTROL_RES_CR10 : return "WAVE_FORMAT_CONTROL_RES_CR10" ; case WAVE_FORMAT_NMS_VBXADPCM : return "WAVE_FORMAT_NMS_VBXADPCM" ; case WAVE_FORMAT_ROCKWELL_ADPCM : return "WAVE_FORMAT_ROCKWELL_ADPCM" ; case WAVE_FORMAT_ROCKWELL_DIGITALK : return "WAVE_FORMAT_ROCKWELL_DIGITALK" ; case WAVE_FORMAT_G721_ADPCM : return "WAVE_FORMAT_G721_ADPCM" ; case WAVE_FORMAT_MPEG : return "WAVE_FORMAT_MPEG" ; case WAVE_FORMAT_MPEGLAYER3 : return "WAVE_FORMAT_MPEGLAYER3" ; case IBM_FORMAT_MULAW : return "IBM_FORMAT_MULAW" ; case IBM_FORMAT_ALAW : return "IBM_FORMAT_ALAW" ; case IBM_FORMAT_ADPCM : return "IBM_FORMAT_ADPCM" ; case WAVE_FORMAT_CREATIVE_ADPCM : return "WAVE_FORMAT_CREATIVE_ADPCM" ; case WAVE_FORMAT_FM_TOWNS_SND : return "WAVE_FORMAT_FM_TOWNS_SND" ; case WAVE_FORMAT_OLIGSM : return "WAVE_FORMAT_OLIGSM" ; case WAVE_FORMAT_OLIADPCM : return "WAVE_FORMAT_OLIADPCM" ; case WAVE_FORMAT_OLICELP : return "WAVE_FORMAT_OLICELP" ; case WAVE_FORMAT_OLISBC : return "WAVE_FORMAT_OLISBC" ; case WAVE_FORMAT_OLIOPR : return "WAVE_FORMAT_OLIOPR" ; case WAVE_FORMAT_EXTENSIBLE : return "WAVE_FORMAT_EXTENSIBLE" ; break ; } ; return "Unknown format" ;} /* wav_format_str */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -