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

📄 sds.c

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 C
📖 第 1 页 / 共 2 页
字号:
	unsigned int sample ;	int 	k ;	psds->read_block ++ ;	psds->read_count = 0 ;	if (psds->read_block * psds->samplesperblock > psds->frames)	{	memset (psds->read_samples, 0, psds->samplesperblock * sizeof (int)) ;		return 1 ;		} ;	if ((k = psf_fread (psds->read_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE)		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, SDS_BLOCK_SIZE) ;	if (psds->read_data [0] != 0xF0)	{	printf ("Error A : %02X\n", psds->read_data [0] & 0xFF) ;		} ;	checksum = psds->read_data [1] ;	if (checksum != 0x7E)	{	printf ("Error 1 : %02X\n", checksum & 0xFF) ;		}	for (k = 2 ; k < SDS_BLOCK_SIZE - 3 ; k ++)		checksum ^= psds->read_data [k] ;	checksum &= 0x7F ;	if (checksum != psds->read_data [SDS_BLOCK_SIZE - 2])	{	psf_log_printf (psf, "Block %d : checksum is %02X should be %02X\n", psds->read_data [4], checksum, psds->read_data [SDS_BLOCK_SIZE - 2]) ;		} ;	ucptr = psds->read_data + 5 ;	for (k = 0 ; k < 120 ; k += 4)	{	sample = (ucptr [k] << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) + (ucptr [k + 3] << 4) ;		psds->read_samples [k / 4] = (int) (sample - 0x80000000) ;		} ;	return 1 ;} /* sds_4byte_read */static sf_count_tsds_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len){	SDS_PRIVATE	*psds ;	int			*iptr ;	int			k, bufferlen, readcount, count ;	sf_count_t	total = 0 ;	if (psf->fdata == NULL)		return 0 ;	psds = (SDS_PRIVATE*) psf->fdata ;	iptr = psf->u.ibuf ;	bufferlen = ARRAY_LEN (psf->u.ibuf) ;	while (len > 0)	{	readcount = (len >= bufferlen) ? bufferlen : len ;		count = sds_read (psf, psds, iptr, readcount) ;		for (k = 0 ; k < readcount ; k++)			ptr [total + k] = iptr [k] >> 16 ;		total += count ;		len -= readcount ;		} ;	return total ;} /* sds_read_s */static sf_count_tsds_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len){	SDS_PRIVATE *psds ;	int			total ;	if (psf->fdata == NULL)		return 0 ;	psds = (SDS_PRIVATE*) psf->fdata ;	total = sds_read (psf, psds, ptr, len) ;	return total ;} /* sds_read_i */static sf_count_tsds_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len){	SDS_PRIVATE	*psds ;	int			*iptr ;	int			k, bufferlen, readcount, count ;	sf_count_t	total = 0 ;	float		normfact ;	if (psf->fdata == NULL)		return 0 ;	psds = (SDS_PRIVATE*) psf->fdata ;	if (psf->norm_float == SF_TRUE)		normfact = 1.0 / 0x80000000 ;	else		normfact = 1.0 / (1 << psds->bitwidth) ;	iptr = psf->u.ibuf ;	bufferlen = ARRAY_LEN (psf->u.ibuf) ;	while (len > 0)	{	readcount = (len >= bufferlen) ? bufferlen : len ;		count = sds_read (psf, psds, iptr, readcount) ;		for (k = 0 ; k < readcount ; k++)			ptr [total + k] = normfact * iptr [k] ;		total += count ;		len -= readcount ;		} ;	return total ;} /* sds_read_f */static sf_count_tsds_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len){	SDS_PRIVATE	*psds ;	int			*iptr ;	int			k, bufferlen, readcount, count ;	sf_count_t	total = 0 ;	double		normfact ;	if (psf->fdata == NULL)		return 0 ;	psds = (SDS_PRIVATE*) psf->fdata ;	if (psf->norm_double == SF_TRUE)		normfact = 1.0 / 0x80000000 ;	else		normfact = 1.0 / (1 << psds->bitwidth) ;	iptr = psf->u.ibuf ;	bufferlen = ARRAY_LEN (psf->u.ibuf) ;	while (len > 0)	{	readcount = (len >= bufferlen) ? bufferlen : len ;		count = sds_read (psf, psds, iptr, readcount) ;		for (k = 0 ; k < readcount ; k++)			ptr [total + k] = normfact * iptr [k] ;		total += count ;		len -= readcount ;		} ;	return total ;} /* sds_read_d */static intsds_read (SF_PRIVATE *psf, SDS_PRIVATE *psds, int *ptr, int len){	int	count, total = 0 ;	while (total < len)	{	if (psds->read_block * psds->samplesperblock >= psds->frames)		{	memset (&(ptr [total]), 0, (len - total) * sizeof (int)) ;			return total ;			} ;		if (psds->read_count >= psds->samplesperblock)			psds->reader (psf, psds) ;		count = (psds->samplesperblock - psds->read_count) ;		count = (len - total > count) ? count : len - total ;		memcpy (&(ptr [total]), &(psds->read_samples [psds->read_count]), count * sizeof (int)) ;		total += count ;		psds->read_count += count ;		} ;	return total ;} /* sds_read *//*==============================================================================*/static sf_count_tsds_seek (SF_PRIVATE *psf, int mode, sf_count_t seek_from_start){	SDS_PRIVATE	*psds ;	sf_count_t	file_offset ;	int			newblock, newsample ;	if ((psds = psf->fdata) == NULL)	{	psf->error = SFE_INTERNAL ;		return SF_SEEK_ERROR ;		} ;	if (psf->datalength < 0 || psf->dataoffset < 0)	{	psf->error = SFE_BAD_SEEK ;		return SF_SEEK_ERROR ;		} ;	if (seek_from_start < 0 || seek_from_start > psf->sf.frames)	{	psf->error = SFE_BAD_SEEK ;		return SF_SEEK_ERROR ;		} ;	if (mode == SFM_READ && psds->write_count > 0)		psds->writer (psf, psds) ;	newblock = seek_from_start / psds->samplesperblock ;	newsample = seek_from_start % psds->samplesperblock ;	switch (mode)	{	case SFM_READ :			if (newblock > psds->total_blocks)			{	psf->error = SFE_BAD_SEEK ;				return SF_SEEK_ERROR ;				} ;			file_offset = psf->dataoffset + newblock * SDS_BLOCK_SIZE ;			if (psf_fseek (psf, file_offset, SEEK_SET) != file_offset)			{	psf->error = SFE_SEEK_FAILED ;				return SF_SEEK_ERROR ;				} ;			psds->read_block = newblock ;			psds->reader (psf, psds) ;			psds->read_count = newsample ;			break ;		case SFM_WRITE :			if (newblock > psds->total_blocks)			{	psf->error = SFE_BAD_SEEK ;				return SF_SEEK_ERROR ;				} ;			file_offset = psf->dataoffset + newblock * SDS_BLOCK_SIZE ;			if (psf_fseek (psf, file_offset, SEEK_SET) != file_offset)			{	psf->error = SFE_SEEK_FAILED ;				return SF_SEEK_ERROR ;				} ;			psds->write_block = newblock ;			psds->reader (psf, psds) ;			psds->write_count = newsample ;			break ;		default :			psf->error = SFE_BAD_SEEK ;			return SF_SEEK_ERROR ;			break ;		} ;	return seek_from_start ;} /* sds_seek *//*==============================================================================*/static intsds_2byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds){	unsigned char *ucptr, checksum ;	unsigned int sample ;	int 	k ;	psds->write_data [0] = 0xF0 ;	psds->write_data [1] = 0x7E ;	psds->write_data [2] = 0 ;							/* Channel number */	psds->write_data [3] = psds->write_block & 0x7F ;	/* Packet number */	ucptr = psds->write_data + 5 ;	for (k = 0 ; k < 120 ; k += 2)	{	sample = psds->write_samples [k / 2] ;		sample += 0x80000000 ;		ucptr [k] = (sample >> 25) & 0x7F ;		ucptr [k + 1] = (sample >> 18) & 0x7F ;		} ;	checksum = psds->write_data [1] ;	for (k = 2 ; k < SDS_BLOCK_SIZE - 3 ; k ++)		checksum ^= psds->write_data [k] ;	checksum &= 0x7F ;	psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ;	psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ;	if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE)		psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ;	psds->write_block ++ ;	psds->write_count = 0 ;	if (psds->write_block > psds->total_blocks)		psds->total_blocks = psds->write_block ;	psds->frames = psds->total_blocks * psds->samplesperblock ;	return 1 ;} /* sds_2byte_write */static intsds_3byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds){	unsigned char *ucptr, checksum ;	unsigned int sample ;	int 	k ;	psds->write_data [0] = 0xF0 ;	psds->write_data [1] = 0x7E ;	psds->write_data [2] = 0 ;							/* Channel number */	psds->write_data [3] = psds->write_block & 0x7F ;	/* Packet number */	ucptr = psds->write_data + 5 ;	for (k = 0 ; k < 120 ; k += 3)	{	sample = psds->write_samples [k / 3] ;		sample += 0x80000000 ;		ucptr [k] = (sample >> 25) & 0x7F ;		ucptr [k + 1] = (sample >> 18) & 0x7F ;		ucptr [k + 2] = (sample >> 11) & 0x7F ;		} ;	checksum = psds->write_data [1] ;	for (k = 2 ; k < SDS_BLOCK_SIZE - 3 ; k ++)		checksum ^= psds->write_data [k] ;	checksum &= 0x7F ;	psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ;	psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ;	if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE)		psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ;	psds->write_block ++ ;	psds->write_count = 0 ;	if (psds->write_block > psds->total_blocks)		psds->total_blocks = psds->write_block ;	psds->frames = psds->total_blocks * psds->samplesperblock ;	return 1 ;} /* sds_3byte_write */static intsds_4byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds){	unsigned char *ucptr, checksum ;	unsigned int sample ;	int 	k ;	psds->write_data [0] = 0xF0 ;	psds->write_data [1] = 0x7E ;	psds->write_data [2] = 0 ;							/* Channel number */	psds->write_data [3] = psds->write_block & 0x7F ;	/* Packet number */	ucptr = psds->write_data + 5 ;	for (k = 0 ; k < 120 ; k += 4)	{	sample = psds->write_samples [k / 4] ;		sample += 0x80000000 ;		ucptr [k] = (sample >> 25) & 0x7F ;		ucptr [k + 1] = (sample >> 18) & 0x7F ;		ucptr [k + 2] = (sample >> 11) & 0x7F ;		ucptr [k + 3] = (sample >> 4) & 0x7F ;		} ;	checksum = psds->write_data [1] ;	for (k = 2 ; k < SDS_BLOCK_SIZE - 3 ; k ++)		checksum ^= psds->write_data [k] ;	checksum &= 0x7F ;	psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ;	psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ;	if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE)		psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ;	psds->write_block ++ ;	psds->write_count = 0 ;	if (psds->write_block > psds->total_blocks)		psds->total_blocks = psds->write_block ;	psds->frames = psds->total_blocks * psds->samplesperblock ;	return 1 ;} /* sds_4byte_write */static sf_count_tsds_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len){	SDS_PRIVATE	*psds ;	int			*iptr ;	int			k, bufferlen, writecount, count ;	sf_count_t	total = 0 ;	if (psf->fdata == NULL)		return 0 ;	psds = (SDS_PRIVATE*) psf->fdata ;	iptr = psf->u.ibuf ;	bufferlen = ARRAY_LEN (psf->u.ibuf) ;	while (len > 0)	{	writecount = (len >= bufferlen) ? bufferlen : len ;		for (k = 0 ; k < writecount ; k++)			iptr [k] = ptr [total + k] << 16 ;		count = sds_write (psf, psds, iptr, writecount) ;		total += count ;		len -= writecount ;		} ;	return total ;} /* sds_write_s */static sf_count_tsds_write_i (SF_PRIVATE *psf, int *ptr, sf_count_t len){	SDS_PRIVATE *psds ;	int			total ;	if (psf->fdata == NULL)		return 0 ;	psds = (SDS_PRIVATE*) psf->fdata ;	total = sds_write (psf, psds, ptr, len) ;	return total ;} /* sds_write_i */static sf_count_tsds_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len){	SDS_PRIVATE	*psds ;	int			*iptr ;	int			k, bufferlen, writecount, count ;	sf_count_t	total = 0 ;	float		normfact ;	if (psf->fdata == NULL)		return 0 ;	psds = (SDS_PRIVATE*) psf->fdata ;	if (psf->norm_float == SF_TRUE)		normfact = 1.0 * 0x80000000 ;	else		normfact = 1.0 * (1 << psds->bitwidth) ;	iptr = psf->u.ibuf ;	bufferlen = ARRAY_LEN (psf->u.ibuf) ;	while (len > 0)	{	writecount = (len >= bufferlen) ? bufferlen : len ;		for (k = 0 ; k < writecount ; k++)			iptr [k] = normfact * ptr [total + k] ;		count = sds_write (psf, psds, iptr, writecount) ;		total += count ;		len -= writecount ;		} ;	return total ;} /* sds_write_f */static sf_count_tsds_write_d (SF_PRIVATE *psf, double *ptr, sf_count_t len){	SDS_PRIVATE	*psds ;	int			*iptr ;	int			k, bufferlen, writecount, count ;	sf_count_t	total = 0 ;	double		normfact ;	if (psf->fdata == NULL)		return 0 ;	psds = (SDS_PRIVATE*) psf->fdata ;	if (psf->norm_double == SF_TRUE)		normfact = 1.0 * 0x80000000 ;	else		normfact = 1.0 * (1 << psds->bitwidth) ;	iptr = psf->u.ibuf ;	bufferlen = ARRAY_LEN (psf->u.ibuf) ;	while (len > 0)	{	writecount = (len >= bufferlen) ? bufferlen : len ;		for (k = 0 ; k < writecount ; k++)			iptr [k] = normfact * ptr [total + k] ;		count = sds_write (psf, psds, iptr, writecount) ;		total += count ;		len -= writecount ;		} ;	return total ;} /* sds_write_d */static intsds_write (SF_PRIVATE *psf, SDS_PRIVATE *psds, int *ptr, int len){	int	count, total = 0 ;	while (total < len)	{	count = psds->samplesperblock - psds->write_count ;		if (count > len - total)			count = len - total ;		memcpy (&(psds->write_samples [psds->write_count]), &(ptr [total]), count * sizeof (int)) ;		total += count ;		psds->write_count += count ;		if (psds->write_count >= psds->samplesperblock)			psds->writer (psf, psds) ;		} ;	return total ;} /* sds_write *//*** Do not edit or modify anything in this comment block.** The arch-tag line is a file identity tag for the GNU Arch** revision control system.**** arch-tag: d5d26aa3-368c-4ca6-bb85-377e5a2578cc*/

⌨️ 快捷键说明

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