wav.c
来自「LastWave」· C语言 代码 · 共 904 行 · 第 1/3 页
C
904 行
return SFE_WAV_FMT_TOO_BIG ; fread (wav_fmt, structsize, 1, psf->file) ; bytesread += structsize ; if (__CPU_IS_BIG_ENDIAN__) le2h_wav_fmt (wav_fmt) ; __psf_sprintf (psf, " Format : 0x%X => %s\n", wav_fmt->format, wav_format_str (wav_fmt->format)) ; __psf_sprintf (psf, " Channels : %d\n", wav_fmt->min.channels) ; __psf_sprintf (psf, " Sample Rate : %d\n", wav_fmt->min.samplerate) ; __psf_sprintf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ; __psf_sprintf (psf, " Block Align : %d\n", wav_fmt->min.blockalign) ; __psf_sprintf (psf, " Bit Width : %d\n", wav_fmt->min.bitwidth) ; psf->sf.samplerate = wav_fmt->min.samplerate ; psf->sf.samples = 0 ; /* Correct this when reading data chunk. */ psf->sf.channels = wav_fmt->min.channels ; switch (wav_fmt->format) { case WAVE_FORMAT_PCM : case WAVE_FORMAT_IEEE_FLOAT : psf->sf.pcmbitwidth = wav_fmt->min.bitwidth ; psf->bytewidth = BITWIDTH2BYTES (wav_fmt->min.bitwidth) ; break ; case WAVE_FORMAT_ALAW : case WAVE_FORMAT_MULAW : 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 ; 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 ; 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 : __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 ; 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 ; 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 ; 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 + =
减小字号Ctrl + -
显示快捷键?