📄 wav.c
字号:
psf_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ; psf->sf.pcmbitwidth = wav_fmt->min.bitwidth ; psf->bytewidth = BITWIDTH2BYTES (wav_fmt->min.bitwidth) ; break ; case WAVE_FORMAT_ALAW : case WAVE_FORMAT_MULAW : if (wav_fmt->min.bytespersec / wav_fmt->min.blockalign != wav_fmt->min.samplerate) psf_sprintf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, wav_fmt->min.samplerate * wav_fmt->min.blockalign) ; else psf_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ; psf->sf.pcmbitwidth = 16 ; psf->bytewidth = 1 ; if (structsize >= 18) psf_sprintf (psf, " Extra Bytes : %d\n", wav_fmt->size20.extrabytes) ; break ; case WAVE_FORMAT_MS_ADPCM : if (wav_fmt->msadpcm.bitwidth != 4) return SFE_WAV_ADPCM_NOT4BIT ; if (wav_fmt->msadpcm.channels < 1 || wav_fmt->msadpcm.channels > 2) return SFE_WAV_ADPCM_CHANNELS ; bytespersec = (wav_fmt->msadpcm.samplerate * wav_fmt->msadpcm.blockalign) / wav_fmt->msadpcm.samplesperblock ; if (wav_fmt->min.bytespersec == bytespersec) psf_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ; else if (wav_fmt->min.bytespersec == (wav_fmt->msadpcm.samplerate / wav_fmt->msadpcm.samplesperblock) * wav_fmt->msadpcm.blockalign) psf_sprintf (psf, " Bytes/sec : %d (should be %d (MS BUG!))\n", wav_fmt->min.bytespersec, bytespersec) ; else psf_sprintf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ; psf->sf.pcmbitwidth = 16 ; psf->bytewidth = 2 ; psf_sprintf (psf, " Extra Bytes : %d\n", wav_fmt->msadpcm.extrabytes) ; psf_sprintf (psf, " Samples/Block : %d\n", wav_fmt->msadpcm.samplesperblock) ; if (wav_fmt->msadpcm.numcoeffs > sizeof (MS_ADPCM_WAV_FMT) / sizeof (int)) { psf_sprintf (psf, " No. of Coeffs : %d ****\n", wav_fmt->msadpcm.numcoeffs) ; wav_fmt->msadpcm.numcoeffs = sizeof (MS_ADPCM_WAV_FMT) / sizeof (int) ; } else psf_sprintf (psf, " No. of Coeffs : %d\n", wav_fmt->msadpcm.numcoeffs) ; psf_sprintf (psf, " Coeff 1 : ") ; for (k = 0 ; k < wav_fmt->msadpcm.numcoeffs ; k++) psf_sprintf (psf, "%d ", wav_fmt->msadpcm.coeffs [k].coeff1) ; psf_sprintf (psf, "\n Coeff 2 : ") ; for (k = 0 ; k < wav_fmt->msadpcm.numcoeffs ; k++) psf_sprintf (psf, "%d ", wav_fmt->msadpcm.coeffs [k].coeff2) ; psf_sprintf (psf, "\n") ; break ; case WAVE_FORMAT_IMA_ADPCM : if (wav_fmt->ima.bitwidth != 4) return SFE_WAV_ADPCM_NOT4BIT ; if (wav_fmt->ima.channels < 1 || wav_fmt->ima.channels > 2) return SFE_WAV_ADPCM_CHANNELS ; bytespersec = (wav_fmt->ima.samplerate * wav_fmt->ima.blockalign) / wav_fmt->ima.samplesperblock ; if (wav_fmt->ima.bytespersec != bytespersec) psf_sprintf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->ima.bytespersec, bytespersec) ; else psf_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->ima.bytespersec) ; psf->sf.pcmbitwidth = 16 ; psf->bytewidth = 2 ; psf_sprintf (psf, " Extra Bytes : %d\n", wav_fmt->ima.extrabytes) ; psf_sprintf (psf, " Samples/Block : %d\n", wav_fmt->ima.samplesperblock) ; break ; case WAVE_FORMAT_EXTENSIBLE : if (wav_fmt->ext.bytespersec / wav_fmt->ext.blockalign != wav_fmt->ext.samplerate) psf_sprintf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->ext.bytespersec, wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) ; else psf_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->ext.bytespersec) ; psf_sprintf (psf, " Valid Bits : %d\n", wav_fmt->ext.validbits) ; psf_sprintf (psf, " Channel Mask : 0x%X\n", wav_fmt->ext.channelmask) ; psf_sprintf (psf, " Subformat\n") ; psf_sprintf (psf, " esf_field1 : 0x%X\n", wav_fmt->ext.esf.esf_field1) ; psf_sprintf (psf, " esf_field2 : 0x%X\n", wav_fmt->ext.esf.esf_field2) ; psf_sprintf (psf, " esf_field3 : 0x%X\n", wav_fmt->ext.esf.esf_field3) ; psf_sprintf (psf, " esf_field4 : ") ; for (k = 0 ; k < 8 ; k++) psf_sprintf (psf, "0x%X ", wav_fmt->ext.esf.esf_field4 [k] & 0xFF) ; psf_sprintf (psf, "\n") ; psf->sf.pcmbitwidth = wav_fmt->ext.bitwidth ; psf->bytewidth = BITWIDTH2BYTES (wav_fmt->ext.bitwidth) ; break ; case WAVE_FORMAT_GSM610 : if (wav_fmt->gsm610.channels != 1 || wav_fmt->gsm610.blockalign != 65) return SFE_WAV_GSM610_FORMAT ; if (wav_fmt->gsm610.samplesperblock != 320) return SFE_WAV_GSM610_FORMAT ; bytespersec = (wav_fmt->gsm610.samplerate * wav_fmt->gsm610.blockalign) / wav_fmt->gsm610.samplesperblock ; if (wav_fmt->gsm610.bytespersec != bytespersec) psf_sprintf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->gsm610.bytespersec, bytespersec) ; else psf_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->gsm610.bytespersec) ; psf->sf.pcmbitwidth = 16 ; psf->bytewidth = 2 ; psf_sprintf (psf, " Extra Bytes : %d\n", wav_fmt->gsm610.extrabytes) ; psf_sprintf (psf, " Samples/Block : %d\n", wav_fmt->gsm610.samplesperblock) ; break ; default : break ; } ; psf->blockwidth = wav_fmt->min.channels * psf->bytewidth ; return 0 ;} /* read_fmt_chunk */staticint write_header (SF_PRIVATE *psf, WAV_FMT *wav_fmt, unsigned int size, int do_fact){ FACT_CHUNK fact_chunk ; unsigned int dword, RIFFsize ; RIFFsize = psf->filelength - 2 * sizeof (dword) ; dword = RIFF_MARKER ; fwrite (&dword, sizeof (dword), 1, psf->file) ; dword = H2LE_INT (RIFFsize) ; fwrite (&dword, sizeof (dword), 1, psf->file) ; dword = WAVE_MARKER ; fwrite (&dword, sizeof (dword), 1, psf->file) ; dword = fmt_MARKER ; fwrite (&dword, sizeof (dword), 1, psf->file) ; dword = H2LE_INT (size) ; fwrite (&dword, sizeof (dword), 1, psf->file) ; if (CPU_IS_BIG_ENDIAN) h2le_wav_fmt (wav_fmt) ; fwrite (wav_fmt, size, 1, psf->file) ; if (do_fact) { dword = fact_MARKER ; fwrite (&dword, sizeof (dword), 1, psf->file) ; dword = H2LE_INT (sizeof (FACT_CHUNK)) ; fwrite (&dword, sizeof (dword), 1, psf->file) ; fact_chunk.samples = H2LE_INT (psf->sf.samples) ; fwrite (&fact_chunk, sizeof (fact_chunk), 1, psf->file) ; } ; return 0 ;} /* write_header */static void le2h_wav_fmt (WAV_FMT *fmt){ int k ; fmt->min.format = ENDSWAP_SHORT (fmt->min.format) ; fmt->min.channels = ENDSWAP_SHORT (fmt->min.channels) ; fmt->min.samplerate = ENDSWAP_INT (fmt->min.samplerate) ; fmt->min.bytespersec = ENDSWAP_INT (fmt->min.bytespersec) ; fmt->min.blockalign = ENDSWAP_SHORT (fmt->min.blockalign) ; fmt->min.bitwidth = ENDSWAP_SHORT (fmt->min.bitwidth) ; switch (fmt->format) { case WAVE_FORMAT_MS_ADPCM : fmt->msadpcm.extrabytes = ENDSWAP_SHORT (fmt->msadpcm.extrabytes) ; fmt->msadpcm.samplesperblock = ENDSWAP_SHORT (fmt->msadpcm.samplesperblock) ; fmt->msadpcm.numcoeffs = ENDSWAP_SHORT (fmt->msadpcm.numcoeffs) ; for (k = 0 ; k < fmt->msadpcm.numcoeffs ; k++) { fmt->msadpcm.coeffs [k].coeff1 = ENDSWAP_SHORT (fmt->msadpcm.coeffs [k].coeff1) ; fmt->msadpcm.coeffs [k].coeff2 = ENDSWAP_SHORT (fmt->msadpcm.coeffs [k].coeff2) ; } ; break ; case WAVE_FORMAT_IMA_ADPCM : fmt->ima.extrabytes = ENDSWAP_SHORT (fmt->ima.extrabytes) ; fmt->ima.samplesperblock = ENDSWAP_SHORT (fmt->ima.samplesperblock) ; break ; case WAVE_FORMAT_ALAW : case WAVE_FORMAT_MULAW : fmt->size20.extrabytes = ENDSWAP_SHORT (fmt->size20.extrabytes) ; fmt->size20.dummy = ENDSWAP_SHORT (fmt->size20.dummy) ; break ; case WAVE_FORMAT_GSM610 : fmt->gsm610.extrabytes = ENDSWAP_SHORT (fmt->gsm610.extrabytes) ; fmt->gsm610.samplesperblock = ENDSWAP_SHORT (fmt->gsm610.samplesperblock) ; break ; default : break ; } ;} /* le2h_wav_fmt */static void h2le_wav_fmt (WAV_FMT *fmt){ int k ; switch (fmt->format) { case WAVE_FORMAT_MS_ADPCM : for (k = 0 ; k < fmt->msadpcm.numcoeffs ; k++) { fmt->msadpcm.coeffs [k].coeff1 = ENDSWAP_SHORT (fmt->msadpcm.coeffs [k].coeff1) ; fmt->msadpcm.coeffs [k].coeff2 = ENDSWAP_SHORT (fmt->msadpcm.coeffs [k].coeff2) ; } ; fmt->msadpcm.numcoeffs = ENDSWAP_SHORT (fmt->msadpcm.numcoeffs) ; fmt->msadpcm.extrabytes = ENDSWAP_SHORT (fmt->msadpcm.extrabytes) ; fmt->msadpcm.samplesperblock = ENDSWAP_SHORT (fmt->msadpcm.samplesperblock) ; break ; case WAVE_FORMAT_IMA_ADPCM : fmt->ima.extrabytes = ENDSWAP_SHORT (fmt->ima.extrabytes) ; fmt->ima.samplesperblock = ENDSWAP_SHORT (fmt->ima.samplesperblock) ; break ; case WAVE_FORMAT_ALAW : case WAVE_FORMAT_MULAW : fmt->size20.extrabytes = ENDSWAP_SHORT (fmt->size20.extrabytes) ; fmt->size20.dummy = ENDSWAP_SHORT (fmt->size20.dummy) ; break ; case WAVE_FORMAT_GSM610 : fmt->gsm610.extrabytes = ENDSWAP_SHORT (fmt->gsm610.extrabytes) ; fmt->gsm610.samplesperblock = ENDSWAP_SHORT (fmt->gsm610.samplesperblock) ; break ; default : break ; } ; fmt->min.format = ENDSWAP_SHORT (fmt->min.format) ; fmt->min.channels = ENDSWAP_SHORT (fmt->min.channels) ; fmt->min.samplerate = ENDSWAP_INT (fmt->min.samplerate) ; fmt->min.bytespersec = ENDSWAP_INT (fmt->min.bytespersec) ; fmt->min.blockalign = ENDSWAP_SHORT (fmt->min.blockalign) ; fmt->min.bitwidth = ENDSWAP_SHORT (fmt->min.bitwidth) ;} /* h2le_wav_fmt */staticconst char* 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 + -