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

📄 paf.c

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 C
📖 第 1 页 / 共 2 页
字号:
		return SF_SEEK_ERROR ;		} ;	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;	if (mode == SFM_READ && ppaf24->write_count > 0)		paf24_write_block (psf, ppaf24) ;	newblock	= offset / ppaf24->samplesperblock ;	newsample	= offset % ppaf24->samplesperblock ;	switch (mode)	{	case SFM_READ :				if (offset > ppaf24->read_block * ppaf24->samplesperblock + ppaf24->read_count)				{	psf->error = SFE_BAD_SEEK ;					return SF_SEEK_ERROR ;					} ;				if (psf->last_op == SFM_WRITE && ppaf24->write_count)					paf24_write_block (psf, ppaf24) ;				psf_fseek (psf, psf->dataoffset + newblock * ppaf24->blocksize, SEEK_SET) ;				ppaf24->read_block = newblock ;				paf24_read_block (psf, ppaf24) ;				ppaf24->read_count = newsample ;				break ;		case SFM_WRITE :				if (offset > ppaf24->sample_count)				{	psf->error = SFE_BAD_SEEK ;					return SF_SEEK_ERROR ;					} ;				if (psf->last_op == SFM_WRITE && ppaf24->write_count)					paf24_write_block (psf, ppaf24) ;				psf_fseek (psf, psf->dataoffset + newblock * ppaf24->blocksize, SEEK_SET) ;				ppaf24->write_block = newblock ;				paf24_read_block (psf, ppaf24) ;				ppaf24->write_count = newsample ;				break ;		default :				psf->error = SFE_BAD_SEEK ;				return SF_SEEK_ERROR ;		} ;	return newblock * ppaf24->samplesperblock + newsample ;} /* paf24_seek */static intpaf24_close (SF_PRIVATE *psf){	PAF24_PRIVATE *ppaf24 ;	if (psf->fdata == NULL)		return 0 ;	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)	{	if (ppaf24->write_count > 0)			paf24_write_block (psf, ppaf24) ;		} ;	return 0 ;} /* paf24_close *//*---------------------------------------------------------------------------*/static intpaf24_read_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24){	int				k, channel ;	unsigned char	*cptr ;	ppaf24->read_block ++ ;	ppaf24->read_count = 0 ;	if (ppaf24->read_block * ppaf24->samplesperblock > ppaf24->sample_count)	{	memset (ppaf24->samples, 0, ppaf24->samplesperblock * ppaf24->channels) ;		return 1 ;		} ;	/* Read the block. */	if ((k = psf_fread (ppaf24->block, 1, ppaf24->blocksize, psf)) != ppaf24->blocksize)		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, ppaf24->blocksize) ;	if (CPU_IS_LITTLE_ENDIAN)	{	/* Do endian swapping if necessary. */		if (psf->endian == SF_ENDIAN_BIG)			endswap_int_array 	(ppaf24->data, 8 * ppaf24->channels) ;		/* Unpack block. */		for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)		{	channel = k % ppaf24->channels ;			cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;			ppaf24->samples [k] = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;			} ;		}	else	{	/* Do endian swapping if necessary. */		if (psf->endian == SF_ENDIAN_BIG)			endswap_int_array 	(ppaf24->data, 8 * ppaf24->channels) ;		/* Unpack block. */		for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)		{	channel = k % ppaf24->channels ;			cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;			ppaf24->samples [k] = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;			} ;		} ;	return 1 ;} /* paf24_read_block */static intpaf24_read (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len){	int	count, total = 0 ;	while (total < len)	{	if (ppaf24->read_block * ppaf24->samplesperblock >= ppaf24->sample_count)		{	memset (&(ptr [total]), 0, (len - total) * sizeof (int)) ;			return total ;			} ;		if (ppaf24->read_count >= ppaf24->samplesperblock)			paf24_read_block (psf, ppaf24) ;		count = (ppaf24->samplesperblock - ppaf24->read_count) * ppaf24->channels ;		count = (len - total > count) ? count : len - total ;		memcpy (&(ptr [total]), &(ppaf24->samples [ppaf24->read_count * ppaf24->channels]), count * sizeof (int)) ;		total += count ;		ppaf24->read_count += count / ppaf24->channels ;		} ;	return total ;} /* paf24_read */static sf_count_tpaf24_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len){	PAF24_PRIVATE 	*ppaf24 ;	int				*iptr ;	int				k, bufferlen, readcount, count ;	sf_count_t		total = 0 ;	if (psf->fdata == NULL)		return 0 ;	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;	iptr = psf->u.ibuf ;	bufferlen = ARRAY_LEN (psf->u.ibuf) ;	while (len > 0)	{	readcount = (len >= bufferlen) ? bufferlen : len ;		count = paf24_read (psf, ppaf24, iptr, readcount) ;		for (k = 0 ; k < readcount ; k++)			ptr [total + k] = iptr [k] >> 16 ;		total += count ;		len -= readcount ;		} ;	return total ;} /* paf24_read_s */static sf_count_tpaf24_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len){	PAF24_PRIVATE *ppaf24 ;	int				total ;	if (psf->fdata == NULL)		return 0 ;	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;	total = paf24_read (psf, ppaf24, ptr, len) ;	return total ;} /* paf24_read_i */static sf_count_tpaf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len){	PAF24_PRIVATE 	*ppaf24 ;	int				*iptr ;	int				k, bufferlen, readcount, count ;	sf_count_t		total = 0 ;	float			normfact ;	if (psf->fdata == NULL)		return 0 ;	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;	normfact = (psf->norm_float == SF_TRUE) ? (1.0 / 0x80000000) : (1.0 / 0x100) ;	iptr = psf->u.ibuf ;	bufferlen = ARRAY_LEN (psf->u.ibuf) ;	while (len > 0)	{	readcount = (len >= bufferlen) ? bufferlen : len ;		count = paf24_read (psf, ppaf24, iptr, readcount) ;		for (k = 0 ; k < readcount ; k++)			ptr [total + k] = normfact * iptr [k] ;		total += count ;		len -= readcount ;		} ;	return total ;} /* paf24_read_f */static sf_count_tpaf24_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len){	PAF24_PRIVATE 	*ppaf24 ;	int				*iptr ;	int				k, bufferlen, readcount, count ;	sf_count_t		total = 0 ;	double 			normfact ;	if (psf->fdata == NULL)		return 0 ;	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;	normfact = (psf->norm_double == SF_TRUE) ? (1.0 / 0x80000000) : (1.0 / 0x100) ;	iptr = psf->u.ibuf ;	bufferlen = ARRAY_LEN (psf->u.ibuf) ;	while (len > 0)	{	readcount = (len >= bufferlen) ? bufferlen : len ;		count = paf24_read (psf, ppaf24, iptr, readcount) ;		for (k = 0 ; k < readcount ; k++)			ptr [total + k] = normfact * iptr [k] ;		total += count ;		len -= readcount ;		} ;	return total ;} /* paf24_read_d *//*---------------------------------------------------------------------------*/static intpaf24_write_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24){	int				k, nextsample, channel ;	unsigned char	*cptr ;	/* First pack block. */	if (CPU_IS_LITTLE_ENDIAN)	{	for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)		{	channel = k % ppaf24->channels ;			cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;			nextsample = ppaf24->samples [k] >> 8 ;			cptr [0] = nextsample ;			cptr [1] = nextsample >> 8 ;			cptr [2] = nextsample >> 16 ;			} ;		/* Do endian swapping if necessary. */		if (psf->endian == SF_ENDIAN_BIG)			endswap_int_array (ppaf24->data, 8 * ppaf24->channels) ;		}	else if (CPU_IS_BIG_ENDIAN)	{	/* This is correct. */		for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)		{	channel = k % ppaf24->channels ;			cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;			nextsample = ppaf24->samples [k] >> 8 ;			cptr [0] = nextsample ;			cptr [1] = nextsample >> 8 ;			cptr [2] = nextsample >> 16 ;			} ;		if (psf->endian == SF_ENDIAN_BIG)			endswap_int_array (ppaf24->data, 8 * ppaf24->channels) ;		} ;	/* Write block to disk. */	if ((k = psf_fwrite (ppaf24->block, 1, ppaf24->blocksize, psf)) != ppaf24->blocksize)		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, ppaf24->blocksize) ;	if (ppaf24->sample_count < ppaf24->write_block * ppaf24->samplesperblock + ppaf24->write_count)		ppaf24->sample_count = ppaf24->write_block * ppaf24->samplesperblock + ppaf24->write_count ;	if (ppaf24->write_count == ppaf24->samplesperblock)	{	ppaf24->write_block ++ ;		ppaf24->write_count = 0 ;		} ;	return 1 ;} /* paf24_write_block */static intpaf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len){	int		count, total = 0 ;	while (total < len)	{	count = (ppaf24->samplesperblock - ppaf24->write_count) * ppaf24->channels ;		if (count > len - total)			count = len - total ;		memcpy (&(ppaf24->samples [ppaf24->write_count * ppaf24->channels]), &(ptr [total]), count * sizeof (int)) ;		total += count ;		ppaf24->write_count += count / ppaf24->channels ;		if (ppaf24->write_count >= ppaf24->samplesperblock)			paf24_write_block (psf, ppaf24) ;		} ;	return total ;} /* paf24_write */static sf_count_tpaf24_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len){	PAF24_PRIVATE 	*ppaf24 ;	int				*iptr ;	int				k, bufferlen, writecount = 0, count ;	sf_count_t		total = 0 ;	if (psf->fdata == NULL)		return 0 ;	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;	iptr = psf->u.ibuf ;	bufferlen = ARRAY_LEN (psf->u.ibuf) ;	while (len > 0)	{	writecount = (len >= bufferlen) ? bufferlen : len ;		for (k = 0 ; k < writecount ; k++)			iptr [k] = ptr [total + k] << 16 ;		count = paf24_write (psf, ppaf24, iptr, writecount) ;		total += count ;		len -= writecount ;		if (count != writecount)			break ;		} ;	return total ;} /* paf24_write_s */static sf_count_tpaf24_write_i (SF_PRIVATE *psf, int *ptr, sf_count_t len){	PAF24_PRIVATE 	*ppaf24 ;	int				writecount, count ;	sf_count_t		total = 0 ;	if (psf->fdata == NULL)		return 0 ;	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;	while (len > 0)	{	writecount = (len > 0x10000000) ? 0x10000000 : (int) len ;		count = paf24_write (psf, ppaf24, ptr, writecount) ;		total += count ;		len -= count ;		if (count != writecount)			break ;		} ;	return total ;} /* paf24_write_i */static sf_count_tpaf24_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len){	PAF24_PRIVATE 	*ppaf24 ;	int				*iptr ;	int				k, bufferlen, writecount = 0, count ;	sf_count_t		total = 0 ;	float			normfact ;	if (psf->fdata == NULL)		return 0 ;	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;	normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : (1.0 / 0x100) ;	iptr = psf->u.ibuf ;	bufferlen = ARRAY_LEN (psf->u.ibuf) ;	while (len > 0)	{	writecount = (len >= bufferlen) ? bufferlen : len ;		for (k = 0 ; k < writecount ; k++)			iptr [k] = lrintf (normfact * ptr [total + k]) ;		count = paf24_write (psf, ppaf24, iptr, writecount) ;		total += count ;		len -= writecount ;		if (count != writecount)			break ;		} ;	return total ;} /* paf24_write_f */static sf_count_tpaf24_write_d (SF_PRIVATE *psf, double *ptr, sf_count_t len){	PAF24_PRIVATE 	*ppaf24 ;	int				*iptr ;	int				k, bufferlen, writecount = 0, count ;	sf_count_t		total = 0 ;	double			normfact ;	if (psf->fdata == NULL)		return 0 ;	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;	normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : (1.0 / 0x100) ;	iptr = psf->u.ibuf ;	bufferlen = ARRAY_LEN (psf->u.ibuf) ;	while (len > 0)	{	writecount = (len >= bufferlen) ? bufferlen : len ;		for (k = 0 ; k < writecount ; k++)			iptr [k] = lrint (normfact * ptr [total+k]) ;		count = paf24_write (psf, ppaf24, iptr, writecount) ;		total += count ;		len -= writecount ;		if (count != writecount)			break ;		} ;	return total ;} /* paf24_write_d *//*** 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: 477a5308-451e-4bbd-bab4-fab6caa4e884*/

⌨️ 快捷键说明

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