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

📄 sndfile.c

📁 Vovida 社区开源的 SIP 协议源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (info->channels < 1 || info->channels > 256)		return 0 ;	switch (info->format & SF_FORMAT_TYPEMASK)	{	case SF_FORMAT_WAV :				if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))					return 1 ;				if (subformat == SF_FORMAT_IMA_ADPCM && info->pcmbitwidth == 16 && info->channels <= 2)					return 1 ;				if (subformat == SF_FORMAT_MS_ADPCM && info->pcmbitwidth == 16 && info->channels <= 2)					return 1 ;				if (subformat == SF_FORMAT_GSM610 && info->pcmbitwidth == 16 && info->channels == 1)					return 1 ;				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)					return 1 ;				if (subformat == SF_FORMAT_FLOAT && info->pcmbitwidth == 32)					return 1 ;				break ;						case SF_FORMAT_AIFF :				if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))					return 1 ;				if (subformat == SF_FORMAT_PCM_LE && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))					return 1 ;				if (subformat == SF_FORMAT_PCM_BE && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))					return 1 ;				if (subformat == SF_FORMAT_FLOAT && (info->pcmbitwidth == 32))					return 1 ;				break ;						case SF_FORMAT_AU :		case SF_FORMAT_AULE :				if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))					return 1 ;				if (subformat == SF_FORMAT_ULAW)					return 1 ;				if (subformat == SF_FORMAT_ALAW)					return 1 ;				if (subformat == SF_FORMAT_G721_32 && info->channels == 1)					return 1 ;				if (subformat == SF_FORMAT_G723_24 && info->channels == 1)					return 1 ;				break ;						case SF_FORMAT_RAW :				if (subformat == SF_FORMAT_PCM_S8 && info->pcmbitwidth == 8)					return 1 ;				if (subformat == SF_FORMAT_PCM_U8 && info->pcmbitwidth == 8)					return 1 ;				if (subformat != SF_FORMAT_PCM_BE && subformat != SF_FORMAT_PCM_LE)					break ;				if (info->pcmbitwidth % 8 || info->pcmbitwidth > 32)					break ;				return 1 ;				break ;		case SF_FORMAT_PAF :				if (subformat == SF_FORMAT_PCM_S8 && info->pcmbitwidth == 8)					return 1 ;				if (subformat != SF_FORMAT_PCM_BE && subformat != SF_FORMAT_PCM_LE)					break ;				if (info->pcmbitwidth % 8 || info->pcmbitwidth > 24)					break ;				return 1 ;				break ;		case SF_FORMAT_SVX :				if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth == 8 || info->pcmbitwidth == 16))					return 1 ;				break ;		case SF_FORMAT_NIST :				if (subformat == SF_FORMAT_PCM_BE && info->pcmbitwidth >= 16 && info->pcmbitwidth <= 32)					return 1 ;				if (subformat == SF_FORMAT_PCM_LE &&  info->pcmbitwidth >= 16 && info->pcmbitwidth <= 32)					return 1 ;				break ;						default : break ;		} ;	return 0 ;} /* sf_format_check *//*------------------------------------------------------------------------------*/size_tsf_get_header_info	(SNDFILE *sndfile, char *buffer, size_t bufferlen, size_t offset){	SF_PRIVATE	*psf ;	int			len ;		if (! sndfile)	{	strncpy (buffer, sf_logbuffer, bufferlen - 1) ;		buffer [bufferlen - 1] = 0 ;		return strlen (sf_logbuffer) ;		} ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;		len = strlen (psf->logbuffer) ;	if (offset < 0 || offset >= len)		return 0 ;		strncpy (buffer, psf->logbuffer, bufferlen - 1) ;	buffer [bufferlen - 1] = 0 ;		return strlen (psf->logbuffer) ;} /* sf_get_header_info *//*------------------------------------------------------------------------------*/size_t	sf_get_lib_version	(char *buffer, size_t bufferlen){	if (! buffer || ! bufferlen)		return 0 ;	strncpy (buffer, PACKAGE "-" VERSION, bufferlen - 1) ;	buffer [bufferlen - 1] = 0 ;		return strlen (buffer) ;} /* sf_get_lib_version *//*------------------------------------------------------------------------------*/double  sf_signal_max   (SNDFILE *sndfile){	SF_PRIVATE 		*psf ;	off_t			position ;	unsigned int	k, len, readcount ;	double 			max = 0.0, *data, temp ;		VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;		/* If the file has a PEAK chunk use that information. */	if (psf->has_peak)	{	int k ;		for (k = 0 ; k < psf->sf.channels ; k++)			if (max < fabs (psf->peak.peak [k].value))				max = fabs (psf->peak.peak [k].value);		return max ;		} ;		/* If the file is not seekable, there is nothing we can do. */	if (! psf->sf.seekable)	{	psf->error = SFE_NOT_SEEKABLE ;		return	0.0 ;		} ;			if (! psf->read_double)	{	psf->error = SFE_UNIMPLEMENTED ;		return	-1 ;		} ;			/* Brute force. Read the whole file and find the biggest sample. */	position = sf_seek (sndfile, 0, SEEK_CUR) ; /* Get current position in file */	sf_seek (sndfile, 0, SEEK_SET) ;			/* Go to start of file. */		len = psf->sf.channels * 1024 ;		data = malloc (len * sizeof (double)) ;	readcount = len ;	while (readcount == len)	{	readcount = sf_read_double (sndfile, data, len, 0) ;		for (k = 0 ; k < len ; k++)		{	temp = data [k] ;			temp = temp < 0.0 ? -temp : temp ;			max  = temp > max ? temp : max ;			} ;		} ;	free (data) ;		sf_seek (sndfile, position, SEEK_SET) ;		/* Return to original position. */		return	max ;} /* sf_signal_max *//*------------------------------------------------------------------------------*/off_t	sf_seek	(SNDFILE *sndfile, off_t offset, int whence){	SF_PRIVATE 	*psf ;	off_t		realseek, position ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;		if (! psf->sf.seekable)	{	psf->error = SFE_NOT_SEEKABLE ;		return	((off_t) -1) ;		} ;		if (psf->seek_func)	{	psf->seek_func (psf, offset, whence) ;		return psf->current ;		} ;			if (! (psf->blockwidth && psf->datalength && psf->dataoffset))	{	psf->error = SFE_BAD_SEEK ;		return	((off_t) -1) ;		} ;	switch (whence)	{	case SEEK_SET :				if (offset < 0 || offset * psf->blockwidth > psf->datalength)				{	psf->error = SFE_BAD_SEEK ;					return	((off_t) -1) ;					} ;				realseek = psf->dataoffset + offset * psf->blockwidth ;				fseek (psf->file, realseek, SEEK_SET) ;				position = ftell (psf->file) ;				break ;		case SEEK_CUR :				/*				realseek = offset * psf->blockwidth ;				position = ftell (psf->file) - psf->dataoffset ;				if (position + realseek > psf->datalength || position + realseek < 0)				{	psf->error = SFE_BAD_SEEK ;					return	((off_t) -1) ;					} ;				fseek (psf->file, realseek, SEEK_CUR) ;				position = ftell (psf->file) ;				*/				position = (ftell (psf->file) - psf->dataoffset) / psf->blockwidth ;				if (psf->current + offset > psf->sf.samples)				{	psf->error = SFE_BAD_SEEK ;					return	((off_t) -1) ;					} ;				realseek = psf->dataoffset + (position + offset) * psf->blockwidth ;				fseek (psf->file, realseek, SEEK_SET) ;				position = ftell (psf->file) ;				break ;		case SEEK_END :				if (offset > 0 || psf->sf.samples + offset < 0)				{	psf->error = SFE_BAD_SEEK ;					return	((off_t) -1) ;					} ;				realseek = (psf->sf.samples + offset) * psf->blockwidth + psf->dataoffset ;				fseek (psf->file, realseek, SEEK_SET) ;				position = ftell (psf->file) ;				break ;						default : 				psf->error = SFE_BAD_SEEK ;				return	((off_t) -1) ;		} ;	psf->current = (position - psf->dataoffset) / psf->blockwidth ;	return psf->current ;} /* sf_seek *//*------------------------------------------------------------------------------*/size_tsf_read_raw		(SNDFILE *sndfile, void *ptr, size_t bytes){	SF_PRIVATE 	*psf ;	size_t		count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;		if (psf->mode != SF_MODE_READ)	{	psf->error = SFE_NOT_READMODE ;		return	0 ;		} ;		if (psf->current >= psf->datalength)	{	memset (ptr, 0, bytes) ;		return 0 ;		} ;		if (bytes % (psf->sf.channels * psf->bytewidth))	{	psf->error = SFE_BAD_READ_ALIGN ;		return 0 ;		} ;		count = fread (ptr, 1, bytes, psf->file) ;			if (count < bytes)		memset (((char*)ptr) + count, 0, bytes - count) ;	psf->current += count / psf->blockwidth ;		return count ;} /* sf_read_raw *//*------------------------------------------------------------------------------*/size_tsf_read_short		(SNDFILE *sndfile, short *ptr, size_t len){	SF_PRIVATE 	*psf ;	size_t		count, extra ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;		if (psf->mode != SF_MODE_READ)	{	psf->error = SFE_NOT_READMODE ;		return 0 ;		} ;		if (len % psf->sf.channels)	{	psf->error = SFE_BAD_READ_ALIGN ;		return 0 ;		} ;		if (psf->current >= psf->sf.samples)	{	memset (ptr, 0, len * sizeof (short)) ;		return 0 ; /* End of file. */		} ;	if (! psf->read_short)	{	psf->error = SFE_UNIMPLEMENTED ;		return	0 ;		} ;			count = psf->read_short (psf, ptr, len) ;		if (psf->current + count / psf->sf.channels > psf->sf.samples)	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;		extra = len - count ;		memset (ptr + count, 0, extra * sizeof (short)) ;		psf->current = psf->sf.samples ;		} ;		psf->current += count / psf->sf.channels ;		return count ;} /* sf_read_short */size_tsf_readf_short		(SNDFILE *sndfile, short *ptr, size_t frames){	SF_PRIVATE 	*psf ;	size_t		count, extra ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;		if (psf->mode != SF_MODE_READ)	{	psf->error = SFE_NOT_READMODE ;		return 0 ;		} ;		if (psf->current >= psf->sf.samples)	{	memset (ptr, 0, frames * psf->sf.channels * sizeof (short)) ;		return 0 ; /* End of file. */		} ;	if (! psf->read_short)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;			count = psf->read_short (psf, ptr, frames * psf->sf.channels) ;		if (psf->current + count / psf->sf.channels > psf->sf.samples)	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;		extra =  frames * psf->sf.channels - count ;		memset (ptr + count, 0, extra * sizeof (short)) ;		psf->current = psf->sf.samples ;		} ;		psf->current += count / psf->sf.channels ;		return count / psf->sf.channels ;} /* sf_readf_short *//*------------------------------------------------------------------------------*/size_t	sf_read_int		(SNDFILE *sndfile, int *ptr, size_t len){	SF_PRIVATE 	*psf ;	size_t		count, extra ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF   (sndfile,psf) ;	if (psf->mode != SF_MODE_READ)	{	psf->error = SFE_NOT_READMODE ;		return 0 ;		} ;		if (len % psf->sf.channels)		return	(psf->error = SFE_BAD_READ_ALIGN) ;		if (psf->current >= psf->sf.samples)	{	memset (ptr, 0, len * sizeof (int)) ;		return 0 ;		} ;	if (! psf->read_int)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;			count = psf->read_int (psf, ptr, len) ;		if (psf->current + count / psf->sf.channels > psf->sf.samples)	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;		extra = len - count ;		memset (ptr + count, 0, extra * sizeof (int)) ;		psf->current = psf->sf.samples ;		} ;		psf->current += count / psf->sf.channels ;		return count ;} /* sf_read_int */size_t	sf_readf_int		(SNDFILE *sndfile, int *ptr, size_t frames){	SF_PRIVATE 	*psf ;	size_t		count, extra ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF   (sndfile,psf) ;	if (psf->mode != SF_MODE_READ)	{	psf->error = SFE_NOT_READMODE ;		return 0 ;		} ;		if (psf->current >= psf->sf.samples)	{	memset (ptr, 0, frames * psf->sf.channels * sizeof (int)) ;		return 0 ;		} ;	if (! psf->read_int)	{	psf->error = SFE_UNIMPLEMENTED ;		return	0 ;		} ;			count = psf->read_int (psf, ptr, frames * psf->sf.channels) ;		if (psf->current + count / psf->sf.channels > psf->sf.samples)	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;		extra = frames * psf->sf.channels - count ;		memset (ptr + count, 0, extra * sizeof (int)) ;		psf->current = psf->sf.samples ;		} ;		psf->current += count / psf->sf.channels ;		return count / psf->sf.channels ;} /* sf_readf_int *//*------------------------------------------------------------------------------*/size_t	sf_read_float		(SNDFILE *sndfile, float *ptr, size_t len){	SF_PRIVATE 	*psf ;	size_t		count, extra ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF   (sndfile,psf) ;	if (psf->mode != SF_MODE_READ)	{	psf->error = SFE_NOT_READMODE ;		return 0 ;		} ;		if (len % psf->sf.channels)		return	(psf->error = SFE_BAD_READ_ALIGN) ;		if (psf->current >= psf->sf.samples)	{	memset (ptr, 0, len * sizeof (float)) ;		return 0 ;		} ;	if (! psf->read_float)	{	psf->error = SFE_UNIMPLEMENTED ;		return	0 ;		} ;			count = psf->read_float (psf, ptr, len) ;		if (psf->current + count / psf->sf.channels > psf->sf.samples)	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;		extra = len - count ;		memset (ptr + count, 0, extra * sizeof (float)) ;		psf->current = psf->sf.samples ;		} ;		psf->current += count / psf->sf.channels ;		return count ;} /* sf_read_float */size_t	sf_readf_float		(SNDFILE *sndfile, float *ptr, size_t frames){	SF_PRIVATE 	*psf ;	size_t		count, extra ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF   (sndfile,psf) ;	if (psf->mode != SF_MODE_READ)	{	psf->error = SFE_NOT_READMODE ;		return 0 ;		} ;		if (psf->current >= psf->sf.samples)	{	memset (ptr, 0, frames * psf->sf.channels * sizeof (float)) ;		return 0 ;		} ;	if (! psf->read_float)	{	psf->error = SFE_UNIMPLEMENTED ;		return	0 ;		} ;		

⌨️ 快捷键说明

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