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

📄 rx2.c

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 C
字号:
/*** Copyright (C) 2001-2004 Erik de Castro Lopo <erikd@mega-nerd.com>**** 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	<stdio.h>#include	<string.h>#include	<ctype.h>#include	<stdarg.h>#include	"sndfile.h"#include	"config.h"#include	"sfendian.h"#include	"common.h"#if (ENABLE_EXPERIMENTAL_CODE == 0)intrx2_open	(SF_PRIVATE *psf){	if (psf)		return SFE_UNIMPLEMENTED ;	return (psf && 0) ;} /* rx2_open */#else/*------------------------------------------------------------------------------ * Macros to handle big/little endian issues.*/#define	CAT_MARKER	(MAKE_MARKER ('C', 'A', 'T', ' '))#define	GLOB_MARKER (MAKE_MARKER ('G', 'L', 'O', 'B'))#define	RECY_MARKER (MAKE_MARKER ('R', 'E', 'C', 'Y'))#define	SLCL_MARKER (MAKE_MARKER ('S', 'L', 'C', 'L'))#define	SLCE_MARKER (MAKE_MARKER ('S', 'L', 'C', 'E'))#define	DEVL_MARKER	(MAKE_MARKER ('D', 'E', 'V', 'L'))#define	TRSH_MARKER	(MAKE_MARKER ('T', 'R', 'S', 'H'))#define	EQ_MARKER	(MAKE_MARKER ('E', 'Q', ' ', ' '))#define	COMP_MARKER (MAKE_MARKER ('C', 'O', 'M', 'P'))#define	SINF_MARKER (MAKE_MARKER ('S', 'I', 'N', 'F'))#define	SDAT_MARKER (MAKE_MARKER ('S', 'D', 'A', 'T'))/*------------------------------------------------------------------------------ * Typedefs for file chunks.*//*------------------------------------------------------------------------------ * Private static functions.*/static int	rx2_close	(SF_PRIVATE *psf) ;/*------------------------------------------------------------------------------** Public functions.*/intrx2_open	(SF_PRIVATE *psf){	static const char *marker_type [4] =	{	"Original Enabled", "Enabled Hidden",		"Additional/PencilTool", "Disabled"		} ;	int error, marker, length, glob_offset, slce_count, frames ;	int sdat_length = 0, slce_total = 0 ;	int n_channels ;	/* So far only doing read. */	psf_binheader_readf (psf, "Epm4", 0, &marker, &length) ;	if (marker != CAT_MARKER)	{	psf_log_printf (psf, "length : %d\n", length) ;		return -1000 ;		} ;	if (length != psf->filelength - 8)		psf_log_printf (psf, "%M : %d (should be %d)\n", marker, length, psf->filelength - 8) ;	else		psf_log_printf (psf, "%M : %d\n", marker, length) ;	/* 'REX2' marker */	psf_binheader_readf (psf, "m", &marker) ;	psf_log_printf (psf, "%M", marker) ;	/* 'HEAD' marker */	psf_binheader_readf (psf, "m", &marker) ;	psf_log_printf (psf, "%M\n", marker) ;	/* Grab 'GLOB' offset. */	psf_binheader_readf (psf, "E4", &glob_offset) ;	glob_offset += 0x14 ;	/* Add the current file offset. */	/* Jump to offset 0x30 */	psf_binheader_readf (psf, "p", 0x30) ;	/* Get name length */	length = 0 ;	psf_binheader_readf (psf, "1", &length) ;	if (length >= SIGNED_SIZEOF (psf->u.cbuf))	{	psf_log_printf (psf, "  Text : %d *** Error : Too sf_count_t!\n") ;		return -1001 ;		}	memset (psf->u.cbuf, 0, sizeof (psf->u.cbuf)) ;	psf_binheader_readf (psf, "b", psf->u.cbuf, length) ;	psf_log_printf (psf, " Text : \"%s\"\n", psf->u.cbuf) ;	/* Jump to GLOB offset position. */	if (glob_offset & 1)		glob_offset ++ ;	psf_binheader_readf (psf, "p", glob_offset) ;	slce_count = 0 ;	/* GLOB */	while (1)	{	psf_binheader_readf (psf, "m", &marker) ;		if (marker != SLCE_MARKER && slce_count > 0)		{	psf_log_printf (psf, "   SLCE count : %d\n", slce_count) ;			slce_count = 0 ;			}		switch (marker)		{	case GLOB_MARKER:					psf_binheader_readf (psf, "E4", &length) ;					psf_log_printf (psf, " %M : %d\n", marker, length) ;					psf_binheader_readf (psf, "j", length) ;					break ;			case RECY_MARKER:					psf_binheader_readf (psf, "E4", &length) ;					psf_log_printf (psf, " %M : %d\n", marker, length) ;					psf_binheader_readf (psf, "j", (length+1) & 0xFFFFFFFE) ; /* ?????? */					break ;			case CAT_MARKER:					psf_binheader_readf (psf, "E4", &length) ;					psf_log_printf (psf, " %M : %d\n", marker, length) ;					/*-psf_binheader_readf (psf, "j", length) ;-*/					break ;			case DEVL_MARKER:					psf_binheader_readf (psf, "mE4", &marker, &length) ;					psf_log_printf (psf, "  DEVL%M : %d\n", marker, length) ;					if (length & 1)						length ++ ;					psf_binheader_readf (psf, "j", length) ;					break ;			case EQ_MARKER:			case COMP_MARKER:					psf_binheader_readf (psf, "E4", &length) ;					psf_log_printf (psf, "   %M : %d\n", marker, length) ;					/* This is weird!!!! why make this (length - 1) */					if (length & 1)						length ++ ;					psf_binheader_readf (psf, "j", length) ;					break ;			case SLCL_MARKER:					psf_log_printf (psf, "  %M\n    (Offset, Next Offset, Type)\n", marker) ;					slce_count = 0 ;					break ;			case SLCE_MARKER:					{	int len [4], indx ;						psf_binheader_readf (psf, "E4444", &len [0], &len [1], &len [2], &len [3]) ;						indx = ((len [3] & 0x0000FFFF) >> 8) & 3 ;						if (len [2] == 1)						{	if (indx != 1)								indx = 3 ;	/* 2 cases, where next slice offset = 1 -> disabled & enabled/hidden */							psf_log_printf (psf, "   %M : (%6d, ?: 0x%X, %s)\n", marker, len [1], (len [3] & 0xFFFF0000) >> 16, marker_type [indx]) ;							}						else						{	slce_total += len [2] ;							psf_log_printf (psf, "   %M : (%6d, SLCE_next_ofs:%d, ?: 0x%X, %s)\n", marker, len [1], len [2], (len [3] & 0xFFFF0000) >> 16, marker_type [indx]) ;							} ;						slce_count ++ ;						} ;					break ;			case SINF_MARKER:					psf_binheader_readf (psf, "E4", &length) ;					psf_log_printf (psf, " %M : %d\n", marker, length) ;					psf_binheader_readf (psf, "E2", &n_channels) ;					n_channels = (n_channels & 0x0000FF00) >> 8 ;					psf_log_printf (psf, "  Channels    : %d\n", n_channels) ;					psf_binheader_readf (psf, "E44", &psf->sf.samplerate, &frames) ;					psf->sf.frames = frames ;					psf_log_printf (psf, "  Sample Rate : %d\n", psf->sf.samplerate) ;					psf_log_printf (psf, "  Frames      : %D\n", psf->sf.frames) ;					psf_binheader_readf (psf, "E4", &length) ;					psf_log_printf (psf, "  ??????????? : %d\n", length) ;					psf_binheader_readf (psf, "E4", &length) ;					psf_log_printf (psf, "  ??????????? : %d\n", length) ;					break ;			case SDAT_MARKER:					psf_binheader_readf (psf, "E4", &length) ;				sdat_length = length ;					/* Get the current offset. */					psf->dataoffset = psf_binheader_readf (psf, NULL) ;					if (psf->dataoffset + length != psf->filelength)						psf_log_printf (psf, " %M : %d (should be %d)\n", marker, length, psf->dataoffset + psf->filelength) ;					else						psf_log_printf (psf, " %M : %d\n", marker, length) ;					break ;			default :					psf_log_printf (psf, "Unknown marker : 0x%X %M", marker, marker) ;					return -1003 ;					break ;			} ;		/* SDAT always last marker in file. */		if (marker == SDAT_MARKER)			break ;		} ;	puts (psf->logbuffer) ;	puts ("-----------------------------------") ;	printf ("SDAT length  : %d\n", sdat_length) ;	printf ("SLCE count   : %d\n", slce_count) ;	/* Hack for zero slice count. */	if (slce_count == 0 && slce_total == 1)		slce_total = frames ;	printf ("SLCE samples : %d\n", slce_total) ;	/* Two bytes per sample. */	printf ("Comp Ratio   : %f:1\n", (2.0 * slce_total * n_channels) / sdat_length) ;	puts (" ") ;	psf->logbuffer [0] = 0 ;	/* OK, have the header although not too sure what it all means. */	psf->endian = SF_ENDIAN_BIG ;	psf->datalength = psf->filelength - psf->dataoffset ; 	if (psf_fseek (psf, psf->dataoffset, SEEK_SET))		return SFE_BAD_SEEK ;	psf->sf.format = (SF_FORMAT_REX2 | SF_FORMAT_DWVW_12) ;	psf->sf.channels	= 1 ;	psf->bytewidth		= 2 ;	psf->blockwidth		= psf->sf.channels * psf->bytewidth ;	if ((error = dwvw_init (psf, 16)))		return error ;	psf->close = rx2_close ;	if (! psf->sf.frames && psf->blockwidth)		psf->sf.frames = psf->datalength / psf->blockwidth ;	/* All done. */	return 0 ;} /* rx2_open *//*------------------------------------------------------------------------------*/static intrx2_close	(SF_PRIVATE *psf){	if (psf->mode == SFM_WRITE)	{	/*  Now we know for certain the length of the file we can re-write		**	correct values for the FORM, 8SVX and BODY chunks.		*/		} ;	return 0 ;} /* rx2_close */#endif/*** 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: 7366e813-9fee-4d1f-881e-e4a691469370*/

⌨️ 快捷键说明

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