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

📄 w64.c

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 C
📖 第 1 页 / 共 2 页
字号:
					if (psf_ftell (psf) & 0x0F)					{	psf_log_printf (psf, "  Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;						psf_binheader_readf (psf, "j", -3) ;						break ;						} ;					psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;					done = SF_TRUE ;					break ;			} ;	/* switch (dword) */		if (psf->sf.seekable == 0 && (parsestage & HAVE_data))			break ;		if (psf_ftell (psf) >= (psf->filelength - (2 * SIGNED_SIZEOF (dword))))			break ;		if (psf->logindex >= SIGNED_SIZEOF (psf->logbuffer) - 2)			return SFE_LOG_OVERRUN ;		} ; /* while (1) */	if (! psf->dataoffset)		return SFE_W64_NO_DATA ;	psf->endian = SF_ENDIAN_LITTLE ;		/* All WAV files are little endian. */	if (psf_ftell (psf) != psf->dataoffset)		psf_fseek (psf, psf->dataoffset, SEEK_SET) ;	psf->close = w64_close ;	if (psf->blockwidth)	{	if (psf->filelength - psf->dataoffset < psf->datalength)			psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;		else			psf->sf.frames = psf->datalength / psf->blockwidth ;		} ;	switch (format)	{	case WAVE_FORMAT_PCM :		case WAVE_FORMAT_EXTENSIBLE :					/* extensible might be FLOAT, MULAW, etc as well! */					psf->sf.format = SF_FORMAT_W64 | u_bitwidth_to_subformat (psf->bytewidth * 8) ;					break ;		case WAVE_FORMAT_MULAW :					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_ULAW) ;					break ;		case WAVE_FORMAT_ALAW :					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_ALAW) ;					break ;		case WAVE_FORMAT_MS_ADPCM :					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM) ;					*blockalign = wav_fmt.msadpcm.blockalign ;					*framesperblock = wav_fmt.msadpcm.samplesperblock ;					break ;		case WAVE_FORMAT_IMA_ADPCM :					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM) ;					*blockalign = wav_fmt.ima.blockalign ;					*framesperblock = wav_fmt.ima.samplesperblock ;					break ;		case WAVE_FORMAT_GSM610 :					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_GSM610) ;					break ;		case WAVE_FORMAT_IEEE_FLOAT :					psf->sf.format = SF_FORMAT_W64 ;					psf->sf.format |= (psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT ;					break ;		default : return SFE_UNIMPLEMENTED ;		} ;	return 0 ;} /* w64_read_header */static intw64_write_header (SF_PRIVATE *psf, int calc_length){	sf_count_t 	fmt_size, current ;	size_t		fmt_pad = 0 ;	int 		subformat, add_fact_chunk = SF_FALSE ;	current = psf_ftell (psf) ;	if (calc_length)	{	psf->filelength = psf_get_filelen (psf) ;		psf->datalength = psf->filelength - psf->dataoffset ;		if (psf->dataend)			psf->datalength -= psf->filelength - psf->dataend ;		if (psf->bytewidth)			psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;		} ;	/* Reset the current header length to zero. */	psf->header [0] = 0 ;	psf->headindex = 0 ;	psf_fseek (psf, 0, SEEK_SET) ;	/* riff marker, length, wave and 'fmt ' markers. */	psf_binheader_writef (psf, "eh8hh", riff_MARKER16, psf->filelength - 8, wave_MARKER16, fmt_MARKER16) ;	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;	switch (subformat)	{	case	SF_FORMAT_PCM_U8 :		case	SF_FORMAT_PCM_16 :		case	SF_FORMAT_PCM_24 :		case	SF_FORMAT_PCM_32 :					fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ;					fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;					fmt_size += fmt_pad ;					/* fmt : format, channels, samplerate */					psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_PCM, psf->sf.channels, psf->sf.samplerate) ;					/*  fmt : bytespersec */					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;					/*  fmt : blockalign, bitwidth */					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ;					break ;		case SF_FORMAT_FLOAT :		case SF_FORMAT_DOUBLE :					fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ;					fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;					fmt_size += fmt_pad ;					/* fmt : format, channels, samplerate */					psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_IEEE_FLOAT, psf->sf.channels, psf->sf.samplerate) ;					/*  fmt : bytespersec */					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;					/*  fmt : blockalign, bitwidth */					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ;					add_fact_chunk = SF_TRUE ;					break ;		case SF_FORMAT_ULAW :					fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ;					fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;					fmt_size += fmt_pad ;					/* fmt : format, channels, samplerate */					psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_MULAW, psf->sf.channels, psf->sf.samplerate) ;					/*  fmt : bytespersec */					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;					/*  fmt : blockalign, bitwidth */					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, 8) ;					add_fact_chunk = SF_TRUE ;					break ;		case SF_FORMAT_ALAW :					fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ;					fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;					fmt_size += fmt_pad ;					/* fmt : format, channels, samplerate */					psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_ALAW, psf->sf.channels, psf->sf.samplerate) ;					/*  fmt : bytespersec */					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;					/*  fmt : blockalign, bitwidth */					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, 8) ;					add_fact_chunk = SF_TRUE ;					break ;		/* Lite remove start */		case SF_FORMAT_IMA_ADPCM :					{	int		blockalign, framesperblock, bytespersec ;						blockalign		= wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;						framesperblock	= 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ;						bytespersec		= (psf->sf.samplerate * blockalign) / framesperblock ;						/* fmt chunk. */						fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;						fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;						fmt_size += fmt_pad ;						/* fmt : size, WAV format type, channels. */						psf_binheader_writef (psf, "e822", fmt_size, WAVE_FORMAT_IMA_ADPCM, psf->sf.channels) ;						/* fmt : samplerate, bytespersec. */						psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ;						/* fmt : blockalign, bitwidth, extrabytes, framesperblock. */						psf_binheader_writef (psf, "e2222", blockalign, 4, 2, framesperblock) ;						} ;					add_fact_chunk = SF_TRUE ;					break ;		case SF_FORMAT_MS_ADPCM :					{	int blockalign, framesperblock, bytespersec, extrabytes ;						blockalign		= wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;						framesperblock	= 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;						bytespersec		= (psf->sf.samplerate * blockalign) / framesperblock ;						/* fmt chunk. */						extrabytes	= 2 + 2 + MSADPCM_ADAPT_COEFF_COUNT * (2 + 2) ;						fmt_size	= 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + extrabytes ;						fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;						fmt_size += fmt_pad ;						/* fmt : size, W64 format type, channels. */						psf_binheader_writef (psf, "e822", fmt_size, WAVE_FORMAT_MS_ADPCM, psf->sf.channels) ;						/* fmt : samplerate, bytespersec. */						psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ;						/* fmt : blockalign, bitwidth, extrabytes, framesperblock. */						psf_binheader_writef (psf, "e22222", blockalign, 4, extrabytes, framesperblock, 7) ;						msadpcm_write_adapt_coeffs (psf) ;						} ;					add_fact_chunk = SF_TRUE ;					break ;		/* Lite remove end */		case SF_FORMAT_GSM610 :					{	int bytespersec ;						bytespersec = (psf->sf.samplerate * WAV_W64_GSM610_BLOCKSIZE) / WAV_W64_GSM610_SAMPLES ;						/* fmt chunk. */						fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;						fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;						fmt_size += fmt_pad ;						/* fmt : size, WAV format type, channels. */						psf_binheader_writef (psf, "e822", fmt_size, WAVE_FORMAT_GSM610, psf->sf.channels) ;						/* fmt : samplerate, bytespersec. */						psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ;						/* fmt : blockalign, bitwidth, extrabytes, framesperblock. */						psf_binheader_writef (psf, "e2222", WAV_W64_GSM610_BLOCKSIZE, 0, 2, WAV_W64_GSM610_SAMPLES) ;						} ;					add_fact_chunk = SF_TRUE ;					break ;		default : 	return SFE_UNIMPLEMENTED ;		} ;	/* Pad to 8 bytes with zeros. */	if (fmt_pad > 0)		psf_binheader_writef (psf, "z", fmt_pad) ;	if (add_fact_chunk)		psf_binheader_writef (psf, "eh88", fact_MARKER16, 16 + 8 + 8, psf->sf.frames) ;	psf_binheader_writef (psf, "eh8", data_MARKER16, psf->datalength + 24) ;	psf_fwrite (psf->header, psf->headindex, 1, psf) ;	if (psf->error)		return psf->error ;	psf->dataoffset = psf->headindex ;	if (current > 0)		psf_fseek (psf, current, SEEK_SET) ;	return psf->error ;} /* w64_write_header */static intw64_close (SF_PRIVATE *psf){	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)		w64_write_header (psf, SF_TRUE) ;	return 0 ;} /* w64_close *//*** Do not edit or modify anything in this comment block.** The arch-tag line is a file identity tag for the GNU Arch** revision control system.**** arch-tag: 9aa4e141-538a-4dd9-99c9-b3f0f2dd4f4a*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -