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

📄 sndfile.c

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 C
📖 第 1 页 / 共 5 页
字号:
	fprintf (stderr, "%s\n", sf_error_number (errnum)) ;	return SFE_NO_ERROR ;} /* sf_perror *//*------------------------------------------------------------------------------*/intsf_error_str (SNDFILE *sndfile, char *str, size_t maxlen){	SF_PRIVATE 	*psf ;	int 		errnum ;	if (! str)		return SFE_INTERNAL ;	if (! sndfile)		errnum = sf_errno ;	else	{	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ;		errnum = psf->error ;		} ;	LSF_SNPRINTF (str, maxlen, "%s", sf_error_number (errnum)) ;	return SFE_NO_ERROR ;} /* sf_error_str *//*==============================================================================*/intsf_format_check	(const SF_INFO *info){	int	subformat, endian ;	subformat = info->format & SF_FORMAT_SUBMASK ;	endian = info->format & SF_FORMAT_ENDMASK ;	/* This is the place where each file format can check if the suppiled	** SF_INFO struct is valid.	** Return 0 on failure, 1 ons success.	*/	if (info->channels < 1 || info->channels > 256)		return 0 ;	if (info->samplerate < 0)		return 0 ;	switch (info->format & SF_FORMAT_TYPEMASK)	{	case SF_FORMAT_WAV :		case SF_FORMAT_WAVEX :				/* WAV is strictly little endian. */				if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)					return 0 ;				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)					return 1 ;				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)					return 1 ;				if ((subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) && info->channels <= 2)					return 1 ;				if (subformat == SF_FORMAT_GSM610 && info->channels == 1)					return 1 ;				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)					return 1 ;				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)					return 1 ;				break ;		case SF_FORMAT_AIFF :				/* AIFF does allow both endian-nesses for PCM data.*/				if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)					return 1 ;				/* Other encodings. Check for endian-ness. */				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)					return 0 ;				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8)					return 1 ;				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)					return 1 ;				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)					return 1 ;				if ((subformat == SF_FORMAT_DWVW_12 || subformat == SF_FORMAT_DWVW_16 ||							subformat == SF_FORMAT_DWVW_24) && info-> channels == 1)					return 1 ;				if (subformat == SF_FORMAT_GSM610 && info->channels == 1)					return 1 ;				if (subformat == SF_FORMAT_IMA_ADPCM && (info->channels == 1 || info->channels == 2))					return 1 ;				break ;		case SF_FORMAT_AU :				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)					return 1 ;				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)					return 1 ;				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)					return 1 ;				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)					return 1 ;				if (subformat == SF_FORMAT_G721_32 && info->channels == 1)					return 1 ;				if (subformat == SF_FORMAT_G723_24 && info->channels == 1)					return 1 ;				if (subformat == SF_FORMAT_G723_40 && info->channels == 1)					return 1 ;				break ;		case SF_FORMAT_RAW :				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)					return 1 ;				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)					return 1 ;				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)					return 1 ;				if (subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_ULAW)					return 1 ;				if ((subformat == SF_FORMAT_DWVW_12 || subformat == SF_FORMAT_DWVW_16 ||							subformat == SF_FORMAT_DWVW_24) && info-> channels == 1)					return 1 ;				if (subformat == SF_FORMAT_GSM610 && info->channels == 1)					return 1 ;				if (subformat == SF_FORMAT_VOX_ADPCM && info->channels == 1)					return 1 ;				break ;		case SF_FORMAT_PAF :				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)					return 1 ;				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)					return 1 ;				break ;		case SF_FORMAT_SVX :				/* SVX currently does not support more than one channel for write.				** Read will allow more than one channel but only allow one here.				*/				if (info->channels != 1)					return 0 ;				/* Always big endian. */				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)					return 0 ;				if ((subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) && info->channels == 1)					return 1 ;				break ;		case SF_FORMAT_NIST :				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)					return 1 ;				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)					return 1 ;				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)					return 1 ;				break ;		case SF_FORMAT_IRCAM :				if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)					return 1 ;				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_FLOAT)					return 1 ;				break ;		case SF_FORMAT_VOC :				/* VOC is strictly little endian. */				if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)					return 0 ;				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)					return 1 ;				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)					return 1 ;				break ;		case SF_FORMAT_W64 :				/* W64 is strictly little endian. */				if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)					return 0 ;				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)					return 1 ;				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)					return 1 ;				if ((subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) && info->channels <= 2)					return 1 ;				if (subformat == SF_FORMAT_GSM610 && info->channels == 1)					return 1 ;				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)					return 1 ;				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)					return 1 ;				break ;		case SF_FORMAT_MAT4 :				if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32)					return 1 ;				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)					return 1 ;				break ;		case SF_FORMAT_MAT5 :				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32)					return 1 ;				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)					return 1 ;				break ;		case SF_FORMAT_PVF :				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32)					return 1 ;				break ;		case SF_FORMAT_XI :				if (info->channels != 1)					return 0 ;				if (subformat == SF_FORMAT_DPCM_8 || subformat == SF_FORMAT_DPCM_16)					return 1 ;				break ;		case SF_FORMAT_HTK :				/* HTK is strictly big endian. */				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)					return 0 ;				if (info->channels != 1)					return 0 ;				if (subformat == SF_FORMAT_PCM_16)					return 1 ;				break ;		case SF_FORMAT_SDS :				/* SDS is strictly big endian. */				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)					return 0 ;				if (info->channels != 1)					return 0 ;				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)					return 1 ;				break ;		case SF_FORMAT_AVR :				/* SDS is strictly big endian. */				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)					return 0 ;				if (info->channels < 1 || info->channels > 2)					return 0 ;				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)					return 1 ;				break ;		case SF_FORMAT_SD2 :				/* SD2 is strictly big endian. */				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)					return 0 ;				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)					return 1 ;				break ;		default : break ;		} ;	return 0 ;} /* sf_format_check *//*------------------------------------------------------------------------------*/intsf_command	(SNDFILE *sndfile, int command, void *data, int datasize){	SF_PRIVATE 		*psf = NULL ;	/* This set of commands do not need the sndfile parameter. */	switch (command)	{	case SFC_GET_LIB_VERSION :			if (data == NULL)				return (psf->error = SFE_BAD_CONTROL_CMD) ;			if (ENABLE_EXPERIMENTAL_CODE)				LSF_SNPRINTF (data, datasize, "%s-%s-exp", PACKAGE_NAME, PACKAGE_VERSION) ;			else				LSF_SNPRINTF (data, datasize, "%s-%s", PACKAGE_NAME, PACKAGE_VERSION) ;			return 0 ;		case SFC_GET_SIMPLE_FORMAT_COUNT :			if (data == NULL || datasize != SIGNED_SIZEOF (int))				return (sf_errno = SFE_BAD_CONTROL_CMD) ;			*((int*) data) = psf_get_format_simple_count () ;			return 0 ;		case SFC_GET_SIMPLE_FORMAT :			if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))				return (sf_errno = SFE_BAD_CONTROL_CMD) ;			return psf_get_format_simple (data) ;		case SFC_GET_FORMAT_MAJOR_COUNT :			if (data == NULL || datasize != SIGNED_SIZEOF (int))				return (sf_errno = SFE_BAD_CONTROL_CMD) ;			*((int*) data) = psf_get_format_major_count () ;			return 0 ;		case SFC_GET_FORMAT_MAJOR :			if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))				return (sf_errno = SFE_BAD_CONTROL_CMD) ;			return psf_get_format_major (data) ;		case SFC_GET_FORMAT_SUBTYPE_COUNT :			if (data == NULL || datasize != SIGNED_SIZEOF (int))				return (sf_errno = SFE_BAD_CONTROL_CMD) ;			*((int*) data) = psf_get_format_subtype_count () ;			return 0 ;		case SFC_GET_FORMAT_SUBTYPE :			if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))				return (sf_errno = SFE_BAD_CONTROL_CMD) ;			return psf_get_format_subtype (data) ;		case SFC_GET_FORMAT_INFO :			if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))				return (sf_errno = SFE_BAD_CONTROL_CMD) ;			return psf_get_format_info (data) ;		} ;	if (sndfile == NULL && command == SFC_GET_LOG_INFO)	{	if (data == NULL)			return (psf->error = SFE_BAD_CONTROL_CMD) ;		LSF_SNPRINTF (data, datasize, "%s", sf_logbuffer) ;		return 0 ;		} ;	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;	switch (command)	{	case SFC_SET_NORM_FLOAT :			psf->norm_float = (datasize) ? SF_TRUE : SF_FALSE ;			return psf->norm_float ;		case SFC_SET_NORM_DOUBLE :			psf->norm_double = (datasize) ? SF_TRUE : SF_FALSE ;			return psf->norm_double ;		case SFC_GET_NORM_FLOAT :			return psf->norm_float ;		case SFC_GET_NORM_DOUBLE :			return psf->norm_double ;		case SFC_SET_SCALE_FLOAT_INT_READ :			{	int old_value = psf->float_int_mult ;				psf->float_int_mult = (datasize != 0) ? SF_TRUE : SF_FALSE ;				if (psf->float_int_mult && psf->float_max < 0.0)					psf->float_max = psf_calc_signal_max (psf, SF_FALSE) ;				return old_value ;				}			break ;		case SFC_SET_ADD_PEAK_CHUNK :			{	int format = psf->sf.format & SF_FORMAT_TYPEMASK ;				/* Only WAV and AIFF support the PEAK chunk. */				if (format != SF_FORMAT_WAV && format != SF_FORMAT_WAVEX && format != SF_FORMAT_AIFF)					return SF_FALSE ;				format = psf->sf.format & SF_FORMAT_SUBMASK ;				/* Only files containg the following data types support the PEAK chunk. */				if (format != SF_FORMAT_FLOAT && format != SF_FORMAT_DOUBLE)					return SF_FALSE ;				} ;			/* Can only do this is in SFM_WRITE mode. */			if (psf->mode != SFM_WRITE)				return SF_FALSE ;			/* If data has already been written this must fail. */			if (psf->have_written)				return psf->has_peak ;			/* Everything seems OK, so set psf->has_peak and re-write header. */			psf->has_peak = (datasize) ? SF_TRUE : SF_FALSE ;			if (psf->write_header)				psf->write_header (psf, SF_TRUE) ;			return psf->has_peak ;		case SFC_GET_LOG_INFO :			if (data == NULL)				return (psf->error = SFE_BAD_CONTROL_CMD) ;			LSF_SNPRINTF (data, datasize, "%s", psf->logbuffer) ;			break ;		case SFC_CALC_SIGNAL_MAX :			if (data == NULL || datasize != sizeof (double))				return (psf->error = SFE_BAD_CONTROL_CMD) ;			*((double*) data) = psf_calc_signal_max (psf, SF_FALSE) ;			break ;		case SFC_CALC_NORM_SIGNAL_MAX :			if (data == NULL || datasize != sizeof (double))				return (psf->error = SFE_BAD_CONTROL_CMD) ;			*((double*) data) = psf_calc_signal_max (psf, SF_TRUE) ;			break ;		case SFC_CALC_MAX_ALL_CHANNELS :			if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels)				return (psf->error = SFE_BAD_CONTROL_CMD) ;			return psf_calc_max_all_channels (psf, (double*) data, SF_FALSE) ;		case SFC_CALC_NORM_MAX_ALL_CHANNELS :			if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels)				return (psf->error = SFE_BAD_CONTROL_CMD) ;			return psf_calc_max_all_channels (psf, (double*) data, SF_TRUE) ;		case SFC_UPDATE_HEADER_NOW :			if (psf->write_header)				psf->write_header (psf, SF_TRUE) ;			break ;		case SFC_SET_UPDATE_HEADER_AUTO :			psf->auto_header = datasize ? SF_TRUE : SF_FALSE ;			return psf->auto_header ;			break ;		case SFC_SET_ADD_DITHER_ON_WRITE :		case SFC_SET_ADD_DITHER_ON_READ :			/*			** FIXME !			** These are obsolete. Just return.			** Remove some time after version 1.0.8.			*/			break ;		case SFC_SET_DITHER_ON_WRITE :			if (data == NULL || datasize != SIGNED_SIZEOF (SF_DITHER_INFO))				return (psf->error = SFE_BAD_CONTROL_CMD) ;			memcpy (&psf->write_dither, data, sizeof (psf->write_dither)) ;			if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)				dither_init (psf, SFM_WRITE) ;			break ;		case SFC_SET_DITHER_ON_READ :			if (data == NULL || datasize != SIGNED_SIZEOF (SF_DITHER_INFO))				return (psf->error = SFE_BAD_CONTROL_CMD) ;			memcpy (&psf->read_dither, data, sizeof (psf->read_dither)) ;			if (psf->mode == SFM_READ || psf->mode == SFM_RDWR)				dither_init (psf, SFM_READ) ;			break ;		case SFC_FILE_TRUNCATE :			if (psf->mode != SFM_WRITE && psf->mode != SFM_RDWR)				return SF_TRUE ;			if (datasize != sizeof (sf_count_t))				return SF_TRUE ;

⌨️ 快捷键说明

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