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

📄 pcm.c

📁 Vovida 社区开源的 SIP 协议源码
💻 C
📖 第 1 页 / 共 5 页
字号:
/*** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>**  ** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU Lesser General Public License as published by** the Free Software Foundation; either version 2.1 of the License, or** (at your option) any later version.** ** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the** GNU Lesser General Public License for more details.** ** You should have received a copy of the GNU Lesser General Public License** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*/#include	<unistd.h>#include	"config.h"#include	"sndfile.h"#include	"common.h"#include	"sfendian.h"/* Important!!! Do not assume that sizeof (tribyte) == 3. Some compilers ** (Metrowerks CodeWarrior for Mac is one) pad the struct with an extra byte.*/typedef	struct{	char	bytes [3] ;} tribyte ;static int	pcm_read_sc2s  (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_read_uc2s  (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_read_les2s (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_read_let2s (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_read_sc2i  (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_read_uc2i  (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_read_les2i (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_read_let2i (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_read_sc2f  (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_read_uc2f  (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_read_les2f (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_read_let2f (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_read_sc2d  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_read_uc2d  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_read_les2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_read_let2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_write_s2sc  (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_write_s2uc  (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_write_s2bes (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_write_s2les (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_write_s2bet (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_write_s2let (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_write_s2bei (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_write_s2lei (SF_PRIVATE *psf, short *ptr, int len) ;static int	pcm_write_i2sc  (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_write_i2uc  (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_write_i2bes (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_write_i2les (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_write_i2bet (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_write_i2let (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_write_i2bei (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_write_i2lei (SF_PRIVATE *psf, int *ptr, int len) ;static int	pcm_write_f2sc  (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_write_f2uc  (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_write_f2bes (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_write_f2les (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_write_f2bet (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_write_f2let (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_write_f2bei (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_write_f2lei (SF_PRIVATE *psf, float *ptr, int len) ;static int	pcm_write_d2sc  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_write_d2uc  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_write_d2bes (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_write_d2les (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_write_d2bet (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_write_d2let (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_write_d2bei (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static int	pcm_write_d2lei (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;static	void	sc2s_array	(signed char *buffer, unsigned int count, short *ptr, int index) ;static	void	uc2s_array	(unsigned char *buffer, unsigned int count, short *ptr, int index) ;static	void	bet2s_array (tribyte *buffer, unsigned int count, short *ptr, int index) ;static	void	let2s_array (tribyte *buffer, unsigned int count, short *ptr, int index) ;static	void	bei2s_array (int *buffer, unsigned int count, short *ptr, int index) ;static	void	lei2s_array (int *buffer, unsigned int count, short *ptr, int index) ;static	void	sc2i_array	(signed char *buffer, unsigned int count, int *ptr, int index) ;static	void	uc2i_array	(unsigned char *buffer, unsigned int count, int *ptr, int index) ;static	void	bes2i_array (short *buffer, unsigned int count, int *ptr, int index) ;static	void	les2i_array (short *buffer, unsigned int count, int *ptr, int index) ;static	void	bet2i_array (tribyte *buffer, unsigned int count, int *ptr, int index) ;static	void	let2i_array (tribyte *buffer, unsigned int count, int *ptr, int index) ;static	void	sc2f_array	(signed char *buffer, unsigned int count, float *ptr, int index, float normfact) ;static	void	uc2f_array	(unsigned char *buffer, unsigned int count, float *ptr, int index, float normfact) ;static	void	bes2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact) ;static	void	les2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact) ;static	void	bet2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact) ;static	void	let2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact) ;static	void	bei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact) ;static	void	lei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact) ;static	void	sc2d_array	(signed char *buffer, unsigned int count, double *ptr, int index, double normfact) ;static	void	uc2d_array	(unsigned char *buffer, unsigned int count, double *ptr, int index, double normfact) ;static	void	bes2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact) ;static	void	les2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact) ;static	void	bet2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact) ;static	void	let2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact) ;static	void	bei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact) ;static	void	lei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact) ;static	void	s2sc_array	(short *ptr, int index, signed char *buffer, unsigned int count) ;static	void	s2uc_array	(short *ptr, int index, unsigned char *buffer, unsigned int count) ;static	void	s2bet_array (short *ptr, int index, tribyte *buffer, unsigned int count) ;static	void	s2let_array (short *ptr, int index, tribyte *buffer, unsigned int count) ;static	void	s2bei_array (short *ptr, int index, int *buffer, unsigned int count) ;static	void	s2lei_array (short *ptr, int index, int *buffer, unsigned int count) ;static	void	i2sc_array	(int *ptr, int index, signed char *buffer, unsigned int count) ;static	void	i2uc_array	(int *ptr, int index, unsigned char *buffer, unsigned int count) ;static	void	i2bes_array (int *ptr, int index, short *buffer, unsigned int count) ;static	void	i2les_array (int *ptr, int index, short *buffer, unsigned int count) ;static	void	i2bet_array (int *ptr, int index, tribyte *buffer, unsigned int count) ;static	void	i2let_array (int *ptr, int index, tribyte *buffer, unsigned int count) ;static	void	f2sc_array	(float *ptr, int index, signed char *buffer, unsigned int count, float normfact) ;static	void	f2uc_array	(float *ptr, int index, unsigned char *buffer, unsigned int count, float normfact) ;static	void	f2bes_array (float *ptr, int index, short *buffer, unsigned int count, float normfact) ;static	void	f2les_array (float *ptr, int index, short *buffer, unsigned int count, float normfact) ;static	void	f2bet_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact) ;static	void	f2let_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact) ;static 	void	f2bei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact) ;static 	void	f2lei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact) ;static	void	d2sc_array	(double *ptr, int index, signed char *buffer, unsigned int count, double normfact) ;static	void	d2uc_array	(double *ptr, int index, unsigned char *buffer, unsigned int count, double normfact) ;static	void	d2bes_array (double *ptr, int index, short *buffer, unsigned int count, double normfact) ;static	void	d2les_array (double *ptr, int index, short *buffer, unsigned int count, double normfact) ;static	void	d2bet_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact) ;static	void	d2let_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact) ;static 	void	d2bei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact) ;static 	void	d2lei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact) ;/*-----------------------------------------------------------------------------------------------*/intpcm_read_init (SF_PRIVATE *psf){	if (psf->bytewidth == 1 && psf->chars == SF_CHARS_SIGNED)	{	psf->read_short  = (func_short)  pcm_read_sc2s ;		psf->read_int    = (func_int)    pcm_read_sc2i ;		psf->read_float  = (func_float)  pcm_read_sc2f ;		psf->read_double = (func_double) pcm_read_sc2d ;		return 0 ;		} 	else if (psf->bytewidth == 1 && psf->chars == SF_CHARS_UNSIGNED)	{	psf->read_short  = (func_short)  pcm_read_uc2s ;		psf->read_int    = (func_int)    pcm_read_uc2i ;		psf->read_float  = (func_float)  pcm_read_uc2f ;		psf->read_double = (func_double) pcm_read_uc2d ;		return 0 ;		} ;			switch (psf->bytewidth * 0x10000 + psf->endian)	{	case  (2 * 0x10000 + SF_ENDIAN_BIG) :				psf->read_short  = (func_short)  pcm_read_bes2s ;				psf->read_int    = (func_int)    pcm_read_bes2i ;				psf->read_float  = (func_float)  pcm_read_bes2f ;				psf->read_double = (func_double) pcm_read_bes2d ;				break ;		case  (3 * 0x10000 + SF_ENDIAN_BIG) :				psf->read_short  = (func_short)  pcm_read_bet2s ;				psf->read_int    = (func_int)    pcm_read_bet2i ;				psf->read_float  = (func_float)  pcm_read_bet2f ;				psf->read_double = (func_double) pcm_read_bet2d ;				break ;		case  (4 * 0x10000 + SF_ENDIAN_BIG) :				psf->read_short  = (func_short)  pcm_read_bei2s ;				psf->read_int    = (func_int)    pcm_read_bei2i ;				psf->read_float  = (func_float)  pcm_read_bei2f ;				psf->read_double = (func_double) pcm_read_bei2d ;				break ;						case  (2 * 0x10000 + SF_ENDIAN_LITTLE) :				psf->read_short  = (func_short)  pcm_read_les2s ;				psf->read_int    = (func_int)    pcm_read_les2i ;				psf->read_float  = (func_float)  pcm_read_les2f ;				psf->read_double = (func_double) pcm_read_les2d ;				break ;		case  (3 * 0x10000 + SF_ENDIAN_LITTLE) :				psf->read_short  = (func_short)  pcm_read_let2s ;				psf->read_int    = (func_int)    pcm_read_let2i ;				psf->read_float  = (func_float)  pcm_read_let2f ;				psf->read_double = (func_double) pcm_read_let2d ;				break ;		case  (4 * 0x10000 + SF_ENDIAN_LITTLE) :				psf->read_short  = (func_short)  pcm_read_lei2s ;				psf->read_int    = (func_int)    pcm_read_lei2i ;				psf->read_float  = (func_float)  pcm_read_lei2f ;				psf->read_double = (func_double) pcm_read_lei2d ;				break ;		default : return SFE_UNIMPLEMENTED ;		} ;	return 0 ;} /* pcm_read_init */intpcm_write_init (SF_PRIVATE *psf){	if (psf->bytewidth == 1 && psf->chars == SF_CHARS_SIGNED)	{	psf->write_short  = (func_short)  pcm_write_s2sc ;		psf->write_int    = (func_int)    pcm_write_i2sc ;		psf->write_float  = (func_float)  pcm_write_f2sc ;		psf->write_double = (func_double) pcm_write_d2sc ;		return 0 ;		} 	else if (psf->bytewidth == 1 && psf->chars == SF_CHARS_UNSIGNED)	{	psf->write_short  = (func_short)  pcm_write_s2uc ;		psf->write_int    = (func_int)    pcm_write_i2uc ;		psf->write_float  = (func_float)  pcm_write_f2uc ;		psf->write_double = (func_double) pcm_write_d2uc ;		return 0 ;		} ;			switch (psf->bytewidth * 0x10000 + psf->endian)	{	case  (2 * 0x10000 + SF_ENDIAN_BIG) :				psf->write_short  = (func_short)  pcm_write_s2bes ;				psf->write_int    = (func_int)    pcm_write_i2bes ;				psf->write_float  = (func_float)  pcm_write_f2bes ;				psf->write_double = (func_double) pcm_write_d2bes ;				break ;						case  (3 * 0x10000 + SF_ENDIAN_BIG) :				psf->write_short  = (func_short)  pcm_write_s2bet ;				psf->write_int    = (func_int)    pcm_write_i2bet ;				psf->write_float  = (func_float)  pcm_write_f2bet ;				psf->write_double = (func_double) pcm_write_d2bet ;				break ;						case  (4 * 0x10000 + SF_ENDIAN_BIG) :				psf->write_short  = (func_short)  pcm_write_s2bei ;				psf->write_int    = (func_int)    pcm_write_i2bei ;				psf->write_float  = (func_float)  pcm_write_f2bei ;				psf->write_double = (func_double) pcm_write_d2bei ;				break ;						case  (2 * 0x10000 + SF_ENDIAN_LITTLE) :				psf->write_short  = (func_short)  pcm_write_s2les ;				psf->write_int    = (func_int)    pcm_write_i2les ;				psf->write_float  = (func_float)  pcm_write_f2les ;				psf->write_double = (func_double) pcm_write_d2les ;				break ;						case  (3 * 0x10000 + SF_ENDIAN_LITTLE) :				psf->write_short  = (func_short)  pcm_write_s2let ;				psf->write_int    = (func_int)    pcm_write_i2let ;				psf->write_float  = (func_float)  pcm_write_f2let ;				psf->write_double = (func_double) pcm_write_d2let ;				break ;						case  (4 * 0x10000 + SF_ENDIAN_LITTLE) :				psf->write_short  = (func_short)  pcm_write_s2lei ;				psf->write_int    = (func_int)    pcm_write_i2lei ;				psf->write_float  = (func_float)  pcm_write_f2lei ;				psf->write_double = (func_double) pcm_write_d2lei ;				break ;						default : return SFE_UNIMPLEMENTED ;		} ;	return 0 ;} /* pcm_read_init *//*-----------------------------------------------------------------------------------------------*/static int		pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, int len){	unsigned int readcount, thisread ;	int		bytecount, bufferlen ;	int		index = 0, total = 0 ;	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;	bytecount = len * psf->bytewidth ;	while (bytecount > 0)	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;		thisread = fread (psf->buffer, 1, readcount, psf->file) ;		sc2s_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;		total += thisread ;		if (thisread < readcount)			break ;		index += thisread / psf->bytewidth ;		bytecount -= thisread ;		} ;	total /= psf->bytewidth ;	if (total < len)		psf->error = SFE_SHORT_READ ;		return total ;} /* pcm_read_sc2s */static intpcm_read_uc2s (SF_PRIVATE *psf, short *ptr, int len){	unsigned int readcount, thisread ;	int		bytecount, bufferlen ;	int		index = 0, total = 0 ;	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;	bytecount = len * psf->bytewidth ;	while (bytecount > 0)	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;		thisread = fread (psf->buffer, 1, readcount, psf->file) ;		uc2s_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;		total += thisread ;		if (thisread < readcount)			break ;		index += thisread / psf->bytewidth ;		bytecount -= thisread ;		} ;	total /= psf->bytewidth ;	if (total < len)		psf->error = SFE_SHORT_READ ;		return total ;} /* pcm_read_uc2s */static intpcm_read_bes2s (SF_PRIVATE *psf, short *ptr, int len){	int		total ;	total = fread (ptr, 1, len * sizeof (short), psf->file) ;	if (CPU_IS_LITTLE_ENDIAN)		endswap_short_array	(ptr, len) ;	total /= psf->bytewidth ;	if (total < len)		psf->error = SFE_SHORT_READ ;		return total ;} /* pcm_read_bes2s */static intpcm_read_les2s (SF_PRIVATE *psf, short *ptr, int len){	int		total ;	total = fread (ptr, 1, len * sizeof (short), psf->file) ;	if (CPU_IS_BIG_ENDIAN)		endswap_short_array	(ptr, len) ;	total /= psf->bytewidth ;	if (total < len)		psf->error = SFE_SHORT_READ ;		return total ;} /* pcm_read_les2s */static intpcm_read_bet2s (SF_PRIVATE *psf, short *ptr, int len){	unsigned int readcount, thisread ;	int		bytecount, bufferlen ;	int		index = 0, total = 0 ;	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;	bytecount = len * psf->bytewidth ;	while (bytecount > 0)	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;		thisread = fread (psf->buffer, 1, readcount, psf->file) ;		bet2s_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;		total += thisread ;		if (thisread < readcount)			break ;		index += thisread / psf->bytewidth ;		bytecount -= thisread ;		} ;

⌨️ 快捷键说明

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