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

📄 sndfile.c

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 C
📖 第 1 页 / 共 5 页
字号:
			{	sf_count_t position ;				position = *((sf_count_t*) data) ;				if (sf_seek (sndfile, position, SEEK_SET) != position)					return SF_TRUE ;				psf->sf.frames = position ;				position = psf_fseek (psf, 0, SEEK_CUR) ;				return psf_ftruncate (psf, position) ;				} ;			break ;		case SFC_SET_RAW_START_OFFSET :			if (data == NULL || datasize != sizeof (sf_count_t))				return (psf->error = SFE_BAD_CONTROL_CMD) ;			if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)				return (psf->error = SFE_BAD_CONTROL_CMD) ;			psf->dataoffset = *((sf_count_t*) data) ;			sf_seek (sndfile, 0, SEEK_CUR) ;			break ;		case SFC_GET_EMBED_FILE_INFO :			if (data == NULL || datasize != sizeof (SF_EMBED_FILE_INFO))				return (psf->error = SFE_BAD_CONTROL_CMD) ;			((SF_EMBED_FILE_INFO*) data)->offset = psf->fileoffset ;			((SF_EMBED_FILE_INFO*) data)->length = psf->filelength ;			break ;		/* Lite remove start */		case SFC_TEST_IEEE_FLOAT_REPLACE :			psf->ieee_replace = (datasize) ? SF_TRUE : SF_FALSE ;			if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_FLOAT)				float32_init (psf) ;			else if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_DOUBLE)				double64_init (psf) ;			else				return (psf->error = SFE_BAD_CONTROL_CMD) ;			break ;		/* Lite remove end */		case SFC_SET_CLIPPING :			psf->add_clipping = (datasize) ? SF_TRUE : SF_FALSE ;			return psf->add_clipping ;		case SFC_GET_CLIPPING :			return psf->add_clipping ;		case SFC_GET_LOOP_INFO :			if (datasize != sizeof (SF_LOOP_INFO))				return SF_FALSE ;			if (psf->loop_info != NULL)			{	SF_LOOP_INFO *temp = (SF_LOOP_INFO *) data ;				memcpy (temp, psf->loop_info, sizeof (SF_LOOP_INFO)) ;				return SF_TRUE ;				} ;			return SF_FALSE ;		default :			/* Must be a file specific command. Pass it on. */			if (psf->command)				return psf->command (psf, command, data, datasize) ;			psf_log_printf (psf, "*** sf_command : cmd = 0x%X\n", command) ;			return (psf->error = SFE_BAD_CONTROL_CMD) ;		} ;	return 0 ;} /* sf_command *//*------------------------------------------------------------------------------*/sf_count_tsf_seek	(SNDFILE *sndfile, sf_count_t offset, int whence){	SF_PRIVATE 	*psf ;	sf_count_t	seek_from_start = 0, retval ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;	if (! psf->sf.seekable)	{	psf->error = SFE_NOT_SEEKABLE ;		return	((sf_count_t) -1) ;		} ;	/* If the whence parameter has a mode ORed in, check to see that	** it makes sense.	*/	if (((whence & SFM_MASK) == SFM_WRITE && psf->mode == SFM_READ) ||			((whence & SFM_MASK) == SFM_WRITE && psf->mode == SFM_WRITE))	{	psf->error = SFE_WRONG_SEEK ;		return ((sf_count_t) -1) ;		} ;	/* Convert all SEEK_CUR and SEEK_END into seek_from_start to be	** used with SEEK_SET.	*/	switch (whence)	{	/* The SEEK_SET behaviour is independant of mode. */		case SEEK_SET :		case SEEK_SET | SFM_READ :		case SEEK_SET | SFM_WRITE :		case SEEK_SET | SFM_RDWR :				seek_from_start = offset ;				break ;		/* The SEEK_CUR is a little more tricky. */		case SEEK_CUR :				if (offset == 0)				{	if (psf->mode == SFM_READ)						return psf->read_current ;					if (psf->mode == SFM_WRITE)						return psf->write_current ;					} ;				if (psf->mode == SFM_READ)					seek_from_start = psf->read_current + offset ;				else if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)					seek_from_start = psf->write_current + offset ;				else					psf->error = SFE_AMBIGUOUS_SEEK ;				break ;		case SEEK_CUR | SFM_READ :				if (offset == 0)					return psf->read_current ;				seek_from_start = psf->read_current + offset ;				break ;		case SEEK_CUR | SFM_WRITE :				if (offset == 0)					return psf->write_current ;				seek_from_start = psf->write_current + offset ;				break ;		/* The SEEK_END */		case SEEK_END :		case SEEK_END | SFM_READ :		case SEEK_END | SFM_WRITE :				seek_from_start = psf->sf.frames + offset ;				break ;		default :				psf->error = SFE_BAD_SEEK ;				break ;		} ;	if (psf->error)		return ((sf_count_t) -1) ;	if (seek_from_start < 0 || seek_from_start > psf->sf.frames)	{	psf->error = SFE_BAD_SEEK ;		return ((sf_count_t) -1) ;		} ;	if (psf->seek)	{	int new_mode = (whence & SFM_MASK) ? (whence & SFM_MASK) : psf->mode ;		retval = psf->seek (psf, new_mode, seek_from_start) ;		switch (new_mode)		{	case SFM_READ :					psf->read_current = retval ;					break ;			case SFM_WRITE :					psf->write_current = retval ;					break ;			case SFM_RDWR :					psf->read_current = retval ;					psf->write_current = retval ;					new_mode = SFM_READ ;					break ;			} ;		psf->last_op = new_mode ;		return retval ;		} ;	psf->error = SFE_AMBIGUOUS_SEEK ;	return ((sf_count_t) -1) ;} /* sf_seek *//*------------------------------------------------------------------------------*/const char*sf_get_string (SNDFILE *sndfile, int str_type){	SF_PRIVATE 	*psf ;	if ((psf = (SF_PRIVATE*) sndfile) == NULL)		return NULL ;	if (psf->Magick != SNDFILE_MAGICK)		return NULL ;	return psf_get_string (psf, str_type) ;} /* sf_get_string */intsf_set_string (SNDFILE *sndfile, int str_type, const char* str){	SF_PRIVATE 	*psf ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;	return psf_set_string (psf, str_type, str) ;} /* sf_get_string *//*==============================================================================*/sf_count_tsf_read_raw		(SNDFILE *sndfile, void *ptr, sf_count_t bytes){	SF_PRIVATE 	*psf ;	sf_count_t	count ;	int			bytewidth, blockwidth ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;	bytewidth = (psf->bytewidth > 0) ? psf->bytewidth : 1 ;	blockwidth = (psf->blockwidth > 0) ? psf->blockwidth : 1 ;	if (psf->mode == SFM_WRITE)	{	psf->error = SFE_NOT_READMODE ;		return	0 ;		} ;	if (bytes < 0 || psf->read_current >= psf->datalength)	{	psf_memset (ptr, 0, bytes) ;		return 0 ;		} ;	if (bytes % (psf->sf.channels * bytewidth))	{	psf->error = SFE_BAD_READ_ALIGN ;		return 0 ;		} ;	count = psf_fread (ptr, 1, bytes, psf) ;	if (count < bytes)		psf_memset (((char*) ptr) + count, 0, bytes - count) ;	psf->read_current += count / blockwidth ;	psf->last_op = SFM_READ ;	return count ;} /* sf_read_raw *//*------------------------------------------------------------------------------*/sf_count_tsf_read_short	(SNDFILE *sndfile, short *ptr, sf_count_t len){	SF_PRIVATE 	*psf ;	sf_count_t	count, extra ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;	if (psf->mode == SFM_WRITE)	{	psf->error = SFE_NOT_READMODE ;		return 0 ;		} ;	if (len % psf->sf.channels)	{	psf->error = SFE_BAD_READ_ALIGN ;		return 0 ;		} ;	if (len <= 0 || psf->read_current >= psf->sf.frames)	{	psf_memset (ptr, 0, len * sizeof (short)) ;		return 0 ; /* End of file. */		} ;	if (! psf->read_short || psf->seek == NULL)	{	psf->error = SFE_UNIMPLEMENTED ;		return	0 ;		} ;	if (psf->last_op != SFM_READ)		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)			return 0 ;	count = psf->read_short (psf, ptr, len) ;	if (psf->read_current + count / psf->sf.channels > psf->sf.frames)	{	count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;		extra = len - count ;		psf_memset (ptr + count, 0, extra * sizeof (short)) ;		psf->read_current = psf->sf.frames ;		} ;	psf->read_current += count / psf->sf.channels ;	psf->last_op = SFM_READ ;	if (psf->read_current > psf->sf.frames)	{	count = psf->sf.channels * (psf->read_current - psf->sf.frames) ;		psf->read_current = psf->sf.frames ;		} ;	return count ;} /* sf_read_short */sf_count_tsf_readf_short		(SNDFILE *sndfile, short *ptr, sf_count_t frames){	SF_PRIVATE 	*psf ;	sf_count_t	count, extra ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;	if (psf->mode == SFM_WRITE)	{	psf->error = SFE_NOT_READMODE ;		return 0 ;		} ;	if (frames <= 0 || psf->read_current >= psf->sf.frames)	{	psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (short)) ;		return 0 ; /* End of file. */		} ;	if (! psf->read_short || psf->seek == NULL)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;	if (psf->last_op != SFM_READ)		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)			return 0 ;	count = psf->read_short (psf, ptr, frames * psf->sf.channels) ;	if (psf->read_current + count / psf->sf.channels > psf->sf.frames)	{	count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;		extra = frames * psf->sf.channels - count ;		psf_memset (ptr + count, 0, extra * sizeof (short)) ;		psf->read_current = psf->sf.frames ;		} ;	psf->read_current += count / psf->sf.channels ;	psf->last_op = SFM_READ ;	if (psf->read_current > psf->sf.frames)	{	count = psf->sf.channels * (psf->read_current - psf->sf.frames) ;		psf->read_current = psf->sf.frames ;		} ;	return count / psf->sf.channels ;} /* sf_readf_short *//*------------------------------------------------------------------------------*/sf_count_tsf_read_int		(SNDFILE *sndfile, int *ptr, sf_count_t len){	SF_PRIVATE 	*psf ;	sf_count_t	count, extra ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;	if (psf->mode == SFM_WRITE)	{	psf->error = SFE_NOT_READMODE ;		return 0 ;		} ;	if (len % psf->sf.channels)	{	psf->error = SFE_BAD_READ_ALIGN ;		return 0 ;		} ;	if (len <= 0 || psf->read_current >= psf->sf.frames)	{	psf_memset (ptr, 0, len * sizeof (int)) ;		return 0 ;		} ;	if (! psf->read_int || psf->seek == NULL)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;	if (psf->last_op != SFM_READ)		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)			return 0 ;	count = psf->read_int (psf, ptr, len) ;	if (psf->read_current + count / psf->sf.channels > psf->sf.frames)	{	count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;		extra = len - count ;		psf_memset (ptr + count, 0, extra * sizeof (int)) ;		psf->read_current = psf->sf.frames ;		} ;	psf->read_current += count / psf->sf.channels ;	psf->last_op = SFM_READ ;	if (psf->read_current > psf->sf.frames)	{	count = psf->sf.channels * (psf->read_current - psf->sf.frames) ;		psf->read_current = psf->sf.frames ;		} ;	return count ;} /* sf_read_int */sf_count_tsf_readf_int	(SNDFILE *sndfile, int *ptr, sf_count_t frames){	SF_PRIVATE 	*psf ;	sf_count_t	count, extra ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;	if (psf->mode == SFM_WRITE)	{	psf->error = SFE_NOT_READMODE ;		return 0 ;		} ;	if (frames <= 0 || psf->read_current >= psf->sf.frames)	{	psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (int)) ;		return 0 ;		} ;	if (! psf->read_int || psf->seek == NULL)	{	psf->error = SFE_UNIMPLEMENTED ;		return	0 ;		} ;	if (psf->last_op != SFM_READ)		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)			return 0 ;	count = psf->read_int (psf, ptr, frames * psf->sf.channels) ;	if (psf->read_current + count / psf->sf.channels > psf->sf.frames)	{	count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;		extra = frames * psf->sf.channels - count ;		psf_memset (ptr + count, 0, extra * sizeof (int)) ;		psf->read_current = psf->sf.frames ;		} ;	psf->read_current += count / psf->sf.channels ;

⌨️ 快捷键说明

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