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

📄 sndfile.c

📁 SIP 1.5.0源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	count = psf->read_float (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 (float)) ;		psf->current = psf->sf.samples ;		} ;		psf->current += count / psf->sf.channels ;		return count / psf->sf.channels ;} /* sf_readf_float *//*------------------------------------------------------------------------------*/size_t	sf_read_double	(SNDFILE *sndfile, double *ptr, size_t len, int normalize){	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 (double)) ;		return 0 ;		} ;			if (! psf->read_double)	{	psf->error = SFE_UNIMPLEMENTED ;		return	0 ;		} ;			count = psf->read_double (psf, ptr, len, normalize) ;		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 (double)) ;		psf->current = psf->sf.samples ;		} ;		psf->current += count / psf->sf.channels ;		return count ;} /* sf_read_double */size_t	sf_readf_double	(SNDFILE *sndfile, double *ptr, size_t frames, int normalize){	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 (double)) ;		return 0 ;		} ;			if (! psf->read_double)	{	psf->error = SFE_UNIMPLEMENTED ;		return	0 ;		} ;			count = psf->read_double (psf, ptr, frames * psf->sf.channels, normalize) ;		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 (double)) ;		psf->current = psf->sf.samples ;		} ;		psf->current += count / psf->sf.channels ;		return count / psf->sf.channels ;} /* sf_readf_double *//*------------------------------------------------------------------------------*/size_t	sf_write_raw	(SNDFILE *sndfile, void *ptr, size_t len){	SF_PRIVATE 	*psf ;	size_t		count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;	if (psf->mode != SF_MODE_WRITE)	{	psf->error = SFE_NOT_WRITEMODE ;		return 0 ;		} ;		if (len % (psf->sf.channels * psf->bytewidth))	{	psf->error = SFE_BAD_WRITE_ALIGN ;		return 0 ;		} ;		count = fwrite (ptr, 1, len, psf->file) ;		psf->current += count / psf->blockwidth ;		return count ;} /* sf_write_raw *//*------------------------------------------------------------------------------*/size_t	sf_write_short		(SNDFILE *sndfile, short *ptr, size_t len){	SF_PRIVATE 	*psf ;	size_t		count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;	if (psf->mode != SF_MODE_WRITE)	{	psf->error = SFE_NOT_WRITEMODE ;		return 0 ;		} ;		if (len % psf->sf.channels)	{	psf->error = SFE_BAD_WRITE_ALIGN ;		return 0 ;		} ;		if (! psf->write_short)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;			count = psf->write_short (sndfile, ptr, len) ;		psf->current += count / psf->sf.channels ;		return count ;} /* sf_write_short */size_t	sf_writef_short		(SNDFILE *sndfile, short *ptr, size_t frames){	SF_PRIVATE 	*psf ;	size_t		count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;	if (psf->mode != SF_MODE_WRITE)	{	psf->error = SFE_NOT_WRITEMODE ;		return 0 ;		} ;		if (! psf->write_short)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;			count = psf->write_short (sndfile, ptr, frames * psf->sf.channels) ;		psf->current += count / psf->sf.channels ;		return count / psf->sf.channels ;} /* sf_writef_short *//*------------------------------------------------------------------------------*/size_t	sf_write_int		(SNDFILE *sndfile, int *ptr, size_t len){	SF_PRIVATE 	*psf ;	size_t		count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;	if (psf->mode != SF_MODE_WRITE)	{	psf->error = SFE_NOT_WRITEMODE ;		return 0 ;		} ;		if (len % psf->sf.channels)	{	psf->error = SFE_BAD_WRITE_ALIGN ;		return 0 ;		} ;		if (! psf->write_int)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;			count = psf->write_int (sndfile, ptr, len) ;	psf->current += count / psf->sf.channels ;		return count ;} /* sf_write_int */size_t	sf_writef_int		(SNDFILE *sndfile, int *ptr, size_t frames){	SF_PRIVATE 	*psf ;	size_t		count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;	if (psf->mode != SF_MODE_WRITE)	{	psf->error = SFE_NOT_WRITEMODE ;		return 0 ;		} ;		if (! psf->write_int)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;			count = psf->write_int (sndfile, ptr, frames * psf->sf.channels) ;	psf->current += count / psf->sf.channels ;		return count / psf->sf.channels ;} /* sf_writef_int *//*------------------------------------------------------------------------------*/size_t	sf_write_float		(SNDFILE *sndfile, float *ptr, size_t len){	SF_PRIVATE 	*psf ;	size_t		count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;	if (psf->mode != SF_MODE_WRITE)	{	psf->error = SFE_NOT_WRITEMODE ;		return 0 ;		} ;		if (len % psf->sf.channels)	{	psf->error = SFE_BAD_WRITE_ALIGN ;		return 0 ;		} ;		if (! psf->write_float)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;			count = psf->write_float (sndfile, ptr, len) ;	psf->current += count / psf->sf.channels ;		return count ;} /* sf_write_float */size_t	sf_writef_float		(SNDFILE *sndfile, float *ptr, size_t frames){	SF_PRIVATE 	*psf ;	size_t		count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;	if (psf->mode != SF_MODE_WRITE)	{	psf->error = SFE_NOT_WRITEMODE ;		return 0 ;		} ;		if (! psf->write_float)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;			count = psf->write_float (sndfile, ptr, frames * psf->sf.channels) ;	psf->current += count / psf->sf.channels ;		return count / psf->sf.channels ;} /* sf_writef_float *//*------------------------------------------------------------------------------*/size_t	sf_write_double		(SNDFILE *sndfile, double *ptr, size_t len, int normalize){	SF_PRIVATE 	*psf ;	size_t		count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;	if (psf->mode != SF_MODE_WRITE)	{	psf->error = SFE_NOT_WRITEMODE ;		return 0 ;		} ;		if (len % psf->sf.channels)	{	psf->error = SFE_BAD_WRITE_ALIGN ;		return	0 ;		} ;			if (! psf->write_double)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;			count = psf->write_double (sndfile, ptr, len, normalize) ;		psf->current += count / psf->sf.channels ;		return count ;} /* sf_write_double */size_t	sf_writef_double		(SNDFILE *sndfile, double *ptr, size_t frames, int normalize){	SF_PRIVATE 	*psf ;	size_t		count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;	if (psf->mode != SF_MODE_WRITE)	{	psf->error = SFE_NOT_WRITEMODE ;		return 0 ;		} ;		if (! psf->write_double)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;			count = psf->write_double (sndfile, ptr, frames * psf->sf.channels, normalize) ;		psf->current += count / psf->sf.channels ;		return count / psf->sf.channels ;} /* sf_writef_double *//*------------------------------------------------------------------------------*/int	sf_close	(SNDFILE *sndfile){	SF_PRIVATE  *psf ;	int			error ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;	if (psf->close)		error = psf->close (psf) ;		fclose (psf->file) ;	memset (psf, 0, sizeof (SF_PRIVATE)) ;			free (psf) ;	return 0 ;} /* sf_close *//*=========================================================================** Private functions.*/static int does_extension_match (const char *ext, const char *test){	char c1, c2 ;	if ((! ext) || (! test))		return 0 ;	if (strlen (ext) != strlen (test))		return 0 ;	while (*ext && *test)	{	c1 = tolower (*ext) ;		c2 = tolower (*test) ;		if (c1 > c2)			return 0 ;		if (c1 < c2)			return 0 ;		ext ++ ;		test ++ ;		} 	return 1 ;} /* does_extension_match */static int is_au_snd_file (const char *filename){	const char *cptr ;	if (! (cptr = strrchr (filename, '.')))		return 0 ;	cptr ++ ;		if (does_extension_match (cptr, "au"))		return 1 ;			if (does_extension_match (cptr, "snd"))		return 1 ;			return 0 ;} /* is_au_snd_file */static int guess_file_type (SF_PRIVATE *psf, const char *filename){	unsigned int buffer [3] ;	psf_binheader_readf (psf, "B", &buffer, sizeof (buffer)) ;	if (buffer [0] == MAKE_MARKER ('R','I','F','F') && buffer [2] == MAKE_MARKER ('W','A','V','E'))		return SF_FORMAT_WAV ;			if (buffer [0] == MAKE_MARKER ('F','O','R','M'))	{	if (buffer [2] == MAKE_MARKER ('A','I','F','F') || buffer [2] == MAKE_MARKER ('A','I','F','C'))			return SF_FORMAT_AIFF ;		if (buffer [2] == MAKE_MARKER ('8','S','V','X') || buffer [2] == MAKE_MARKER ('1','6','S','V'))			return SF_FORMAT_SVX ;		return 0 ;		} ;			if ((buffer [0] == MAKE_MARKER ('.','s','n','d') || buffer [0] == MAKE_MARKER ('d','n','s','.')))		return SF_FORMAT_AU ;			if ((buffer [0] == MAKE_MARKER ('f','a','p',' ') || buffer [0] == MAKE_MARKER (' ','p','a','f')))		return SF_FORMAT_PAF ;		if (buffer [0] == MAKE_MARKER ('N','I','S','T'))		return SF_FORMAT_NIST ;			if (buffer [0] == MAKE_MARKER ('S','E','K','D') && buffer [1] == MAKE_MARKER ('S','A','M','R'))		return SF_FORMAT_SMPLTD ;			if (buffer [0] == MAKE_MARKER ('C','r','e','a') && buffer [1] == MAKE_MARKER ('t','i','v','e'))		return SF_FORMAT_VOC ;			if (buffer [0] == MAKE_MARKER ('C', 'A', 'T', ' ') && buffer [2] == MAKE_MARKER ('R', 'E', 'X', '2'))		return SF_FORMAT_REX2 ;	if (buffer [0] == MAKE_MARKER (0x30, 0x26, 0xB2, 0x75) && buffer [1] == MAKE_MARKER (0x8E, 0x66, 0xCF, 0x11))		return SF_FORMAT_WMA ;	/* This is be the last one. */			if (filename && is_au_snd_file (filename))		return SF_FORMAT_AU | SF_FORMAT_ULAW ;	/* Default to header-less RAW PCM file type. */	return SF_FORMAT_RAW ;} /* guess_file_type */static int validate_sfinfo (SF_INFO *sfinfo){	if (! sfinfo->samplerate)		return 0 ;		if (! sfinfo->samples)		return 0 ;		if (! sfinfo->channels)		return 0 ;		if (! sfinfo->pcmbitwidth)		return 0 ;		if (! sfinfo->format & SF_FORMAT_TYPEMASK)		return 0 ;		if (! sfinfo->format & SF_FORMAT_SUBMASK)		return 0 ;		if (! sfinfo->sections)		return 0 ;		return 1 ;} /* validate_sfinfo */static intvalidate_psf (SF_PRIVATE *psf){	if (! psf->blockwidth)		return 0 ;		if (! psf->bytewidth)		return 0 ;		if (! psf->datalength)		return 0 ;	if (psf->blockwidth != psf->sf.channels * psf->bytewidth)		return 0 ;		return 1 ;} /* validate_psf */static void save_header_info (SF_PRIVATE *psf){	memset (sf_logbuffer, 0, sizeof (sf_logbuffer)) ;	strncpy (sf_logbuffer, psf->logbuffer, sizeof (sf_logbuffer)) ;} /* save_header_info */static void copy_filename (SF_PRIVATE *psf, const char *path){	const char *cptr ;	if ((cptr = strrchr (path, '/')) || (cptr = strrchr (path, '\\')))		cptr ++ ;	else		cptr = path ;			memset (psf->filename, 0, SF_FILENAME_LEN) ;	strncpy (psf->filename, cptr, SF_FILENAME_LEN - 1) ;	psf->filename [SF_FILENAME_LEN - 1] = 0 ;} /* copy_filename */

⌨️ 快捷键说明

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