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

📄 sndfile.c

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 C
📖 第 1 页 / 共 5 页
字号:
	if (len % psf->sf.channels)	{	psf->error = SFE_BAD_WRITE_ALIGN ;		return 0 ;		} ;	if (! psf->write_float || psf->seek == NULL)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;	if (psf->last_op != SFM_WRITE)		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)			return 0 ;	if (psf->have_written == SF_FALSE && psf->write_header != NULL)		psf->write_header (psf, SF_FALSE) ;	psf->have_written = SF_TRUE ;	count = psf->write_float (psf, ptr, len) ;	psf->write_current += count / psf->sf.channels ;	psf->last_op = SFM_WRITE ;	if (psf->auto_header)		psf->write_header (psf, SF_TRUE) ;	if (psf->write_current > psf->sf.frames)		psf->sf.frames = psf->write_current ;	return count ;} /* sf_write_float */sf_count_tsf_writef_float	(SNDFILE *sndfile, float *ptr, sf_count_t frames){	SF_PRIVATE 	*psf ;	sf_count_t	count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;	if (psf->mode == SFM_READ)	{	psf->error = SFE_NOT_WRITEMODE ;		return 0 ;		} ;	if (! psf->write_float || psf->seek == NULL)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;	if (psf->last_op != SFM_WRITE)		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)			return 0 ;	if (psf->have_written == SF_FALSE && psf->write_header != NULL)		psf->write_header (psf, SF_FALSE) ;	psf->have_written = SF_TRUE ;	count = psf->write_float (psf, ptr, frames * psf->sf.channels) ;	psf->write_current += count / psf->sf.channels ;	psf->last_op = SFM_WRITE ;	if (psf->auto_header)		psf->write_header (psf, SF_TRUE) ;	if (psf->write_current > psf->sf.frames)		psf->sf.frames = psf->write_current ;	return count / psf->sf.channels ;} /* sf_writef_float *//*------------------------------------------------------------------------------*/sf_count_tsf_write_double	(SNDFILE *sndfile, double *ptr, sf_count_t len){	SF_PRIVATE 	*psf ;	sf_count_t	count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;	if (psf->mode == SFM_READ)	{	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->seek == NULL)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;	if (psf->last_op != SFM_WRITE)		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)			return 0 ;	if (psf->have_written == SF_FALSE && psf->write_header != NULL)		psf->write_header (psf, SF_FALSE) ;	psf->have_written = SF_TRUE ;	count = psf->write_double (psf, ptr, len) ;	psf->write_current += count / psf->sf.channels ;	psf->last_op = SFM_WRITE ;	if (psf->auto_header)		psf->write_header (psf, SF_TRUE) ;	if (psf->write_current > psf->sf.frames)		psf->sf.frames = psf->write_current ;	return count ;} /* sf_write_double */sf_count_tsf_writef_double	(SNDFILE *sndfile, double *ptr, sf_count_t frames){	SF_PRIVATE 	*psf ;	sf_count_t	count ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;	if (psf->mode == SFM_READ)	{	psf->error = SFE_NOT_WRITEMODE ;		return 0 ;		} ;	if (! psf->write_double || psf->seek == NULL)	{	psf->error = SFE_UNIMPLEMENTED ;		return 0 ;		} ;	if (psf->last_op != SFM_WRITE)		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)			return 0 ;	if (psf->have_written == SF_FALSE && psf->write_header != NULL)		psf->write_header (psf, SF_FALSE) ;	psf->have_written = SF_TRUE ;	count = psf->write_double (psf, ptr, frames * psf->sf.channels) ;	psf->write_current += count / psf->sf.channels ;	psf->last_op = SFM_WRITE ;	if (psf->auto_header)		psf->write_header (psf, SF_TRUE) ;	if (psf->write_current > psf->sf.frames)		psf->sf.frames = psf->write_current ;	return count / psf->sf.channels ;} /* sf_writef_double *//*=========================================================================** Private functions.*/static inttry_resource_fork (SF_PRIVATE * psf, int mode){	if (psf_open_rsrc (psf, mode) != 0)		return 0 ;	/* More checking here. */	psf_log_printf (psf, "Resource fork : %s\n", psf->rsrcpath) ;	return SF_FORMAT_SD2 ;} /* try_resource_fork */static intformat_from_extension (const char *filename){	char *cptr ;	char buffer [16] ;	if (filename == NULL)		return 0 ;	if ((cptr = strrchr (filename, '.')) == NULL)		return 0 ;	cptr ++ ;	if (strlen (cptr) > sizeof (buffer) - 1)		return 0 ;	strncpy (buffer, cptr, sizeof (buffer)) ;	buffer [sizeof (buffer) - 1] = 0 ;	/* Convert everything in the buffer to lower case. */	cptr = buffer ;	while (*cptr)	{	*cptr = tolower (*cptr) ;		cptr ++ ;		} ;	cptr = buffer ;	if (strcmp (cptr, "au") == 0)		return SF_FORMAT_AU | SF_FORMAT_ULAW ;	if (strcmp (cptr, "snd") == 0)		return SF_FORMAT_AU | SF_FORMAT_ULAW ;	if (strcmp (cptr, "vox") == 0)		return SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ;	return 0 ;} /* format_from_extension */static intguess_file_type (SF_PRIVATE *psf, const char *filename){	int buffer [3], format ;	if (psf_binheader_readf (psf, "b", &buffer, SIGNED_SIZEOF (buffer)) != SIGNED_SIZEOF (buffer))	{	psf->error = SFE_BAD_FILE_READ ;		return 0 ;		} ;	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 ('C', 'r', 'e', 'a') && buffer [1] == MAKE_MARKER ('t', 'i', 'v', 'e'))		return SF_FORMAT_VOC ;	if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0xF8, 0xFF)) == MAKE_MARKER (0x64, 0xA3, 0x00, 0x00) ||		(buffer [0] & MAKE_MARKER (0xFF, 0xF8, 0xFF, 0xFF)) == MAKE_MARKER (0x00, 0x00, 0xA3, 0x64))		return SF_FORMAT_IRCAM ;	if (buffer [0] == MAKE_MARKER ('r', 'i', 'f', 'f'))		return SF_FORMAT_W64 ;	if (buffer [0] == MAKE_MARKER (0, 0, 0x03, 0xE8) && buffer [1] == MAKE_MARKER (0, 0, 0, 1) &&								buffer [2] == MAKE_MARKER (0, 0, 0, 1))		return SF_FORMAT_MAT4 ;	if (buffer [0] == MAKE_MARKER (0, 0, 0, 0) && buffer [1] == MAKE_MARKER (1, 0, 0, 0) &&								buffer [2] == MAKE_MARKER (1, 0, 0, 0))		return SF_FORMAT_MAT4 ;	if (buffer [0] == MAKE_MARKER ('M', 'A', 'T', 'L') && buffer [1] == MAKE_MARKER ('A', 'B', ' ', '5'))		return SF_FORMAT_MAT5 ;	if (buffer [0] == MAKE_MARKER ('P', 'V', 'F', '1'))		return SF_FORMAT_PVF ;	if (buffer [0] == MAKE_MARKER ('E', 'x', 't', 'e') && buffer [1] == MAKE_MARKER ('n', 'd', 'e', 'd') &&								buffer [2] == MAKE_MARKER (' ', 'I', 'n', 's'))		return SF_FORMAT_XI ;	if (ENABLE_EXPERIMENTAL_CODE && buffer [0] == MAKE_MARKER ('O', 'g', 'g', 'S'))		return SF_FORMAT_OGG ;	if (buffer [0] == MAKE_MARKER ('A', 'L', 'a', 'w') && buffer [1] == MAKE_MARKER ('S', 'o', 'u', 'n')			&& buffer [2] == MAKE_MARKER ('d', 'F', 'i', 'l'))		return SF_FORMAT_WVE ;	if (buffer [0] == MAKE_MARKER ('D', 'i', 'a', 'm') && buffer [1] == MAKE_MARKER ('o', 'n', 'd', 'W')			&& buffer [2] == MAKE_MARKER ('a', 'r', 'e', ' '))		return SF_FORMAT_DWD ;	if (buffer [0] == MAKE_MARKER ('L', 'M', '8', '9') || buffer [0] == MAKE_MARKER ('5', '3', 0, 0))		return SF_FORMAT_TXW ;	if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0x80, 0xFF)) == MAKE_MARKER (0xF0, 0x7E, 0, 0x01))		return SF_FORMAT_SDS ;	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 0 /*-SF_FORMAT_WMA-*/ ;	/* HMM (Hidden Markov Model) Tool Kit. */	if (2 * BEI2H_INT (buffer [0]) + 12 == psf->filelength && buffer [2] == MAKE_MARKER (0, 2, 0, 0))		return SF_FORMAT_HTK ;	if (buffer [0] == MAKE_MARKER ('f', 'L', 'a', 'C'))		return 0 /*-SF_FORMAT_FLAC-*/ ;	/* Turtle Beach SMP 16-bit */	if (buffer [0] == MAKE_MARKER ('S', 'O', 'U', 'N') && buffer [1] == MAKE_MARKER ('D', ' ', 'S', 'A'))		return 0 ;	if (buffer [0] == MAKE_MARKER ('S', 'Y', '8', '0') || buffer [0] == MAKE_MARKER ('S', 'Y', '8', '5'))		return 0 ;	if (buffer [0] == MAKE_MARKER ('a', 'j', 'k', 'g'))		return 0 /*-SF_FORMAT_SHN-*/ ;	if (buffer [0] == MAKE_MARKER ('2', 'B', 'I', 'T'))		return SF_FORMAT_AVR ;	/* This must be the second last one. */	if (psf->filelength > 0 && (format = try_resource_fork (psf, SFM_READ)) != 0)		return format ;	/* This must be the last one. */	if ((format = format_from_extension (filename)) != 0)		return format ;	/* Default to header-less RAW PCM file type. */	return SF_FORMAT_RAW ;} /* guess_file_type */static intvalidate_sfinfo (SF_INFO *sfinfo){	if (sfinfo->samplerate < 1)		return 0 ;	if (sfinfo->frames < 0)		return 0 ;	if (sfinfo->channels < 1)		return 0 ;	if ((sfinfo->format & SF_FORMAT_TYPEMASK) == 0)		return 0 ;	if ((sfinfo->format & SF_FORMAT_SUBMASK) == 0)		return 0 ;	if (sfinfo->sections < 1)		return 0 ;	return 1 ;} /* validate_sfinfo */static intvalidate_psf (SF_PRIVATE *psf){	if (psf->datalength < 0)	{	psf_log_printf (psf, "Invalid SF_PRIVATE field : datalength == %D.\n", psf->datalength) ;		return 0 ;		} ;	if (psf->dataoffset < 0)	{	psf_log_printf (psf, "Invalid SF_PRIVATE field : dataoffset == %D.\n", psf->dataoffset) ;		return 0 ;		} ;	if (psf->blockwidth && psf->blockwidth != psf->sf.channels * psf->bytewidth)	{	psf_log_printf (psf, "Invalid SF_PRIVATE field : channels * bytewidth == %d.\n",								psf->sf.channels * psf->bytewidth) ;		return 0 ;		} ;	return 1 ;} /* validate_psf */static voidsave_header_info (SF_PRIVATE *psf){	LSF_SNPRINTF (sf_logbuffer, sizeof (sf_logbuffer), "%s", psf->logbuffer) ;} /* save_header_info */static voidcopy_filename (SF_PRIVATE *psf, const char *path){	const char *cptr ;	LSF_SNPRINTF (psf->filepath, sizeof (psf->filepath), "%s", path) ;	if ((cptr = strrchr (path, '/')) || (cptr = strrchr (path, '\\')))		cptr ++ ;	else		cptr = path ;	memset (psf->filename, 0, sizeof (psf->filename)) ;	LSF_SNPRINTF (psf->filename, sizeof (psf->filename), "%s", cptr) ;} /* copy_filename *//*==============================================================================*/static intpsf_close (SF_PRIVATE *psf){	int			error ;	if (psf->close)		error = psf->close (psf) ;	psf_fclose (psf) ;	if (psf->rsrcdes >= 0)		psf_close_rsrc (psf) ;	if (psf->fdata)		free (psf->fdata) ;	if (psf->interleave)		free (psf->interleave) ;	if (psf->dither)		free (psf->dither) ;	if (psf->pchunk)		free (psf->pchunk) ;	if (psf->format_desc)	{	memset (psf->format_desc, 0, strlen (psf->format_desc)) ;		free (psf->format_desc) ;		} ;	memset (psf, 0, sizeof (SF_PRIVATE)) ;	free (psf) ;	return 0 ;} /* psf_close */static intpsf_open_file (SF_PRIVATE *psf, int mode, SF_INFO *sfinfo){	int		error, format ;	if (mode != SFM_READ && mode != SFM_WRITE && mode != SFM_RDWR)		return SFE_BAD_OPEN_MODE ;	if (sfinfo == NULL)		return SFE_BAD_SF_INFO_PTR ;	/* Zero out these fields. */	sfinfo->frames = 0 ;	sfinfo->sections = 0 ;	sfinfo->seekable = 0 ;	if (mode == SFM_READ)	{	if ((sfinfo->format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW)

⌨️ 快捷键说明

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