⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wav.c

📁 Vovida 社区开源的 SIP 协议源码
💻 C
📖 第 1 页 / 共 3 页
字号:
					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 + -