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

📄 wavint.c

📁 音频压缩解压缩软件
💻 C
字号:
#include  <stdio.h>#include	<sys/types.h>#include	<unistd.h>#include  <string.h>#include <fcntl.h>#include "def.h"#include "WAVint.h"#define		BUFFERSIZE   		1024#define		PCM_WAVE_FORMAT   	6#define		TRUE			1#define		FALSE			0#define WW_BADOUTPUTFILE	1#define WW_BADWRITEHEADER	2#define WR_BADALLOC		3#define WR_BADSEEK		4#define WR_BADRIFF		5#define WR_BADWAVE		6#define WR_BADFORMAT		7#define WR_BADFORMATSIZE	8#define WR_NOTPCMFORMAT		9#define WR_NODATACHUNK		10#define WR_BADFORMATDATA	11typedef  struct{	u_long     dwSize ;	u_short    wFormatTag ;	u_short    wChannels ;	u_long     dwSamplesPerSec ;	u_long     dwAvgBytesPerSec ;	u_short    wBlockAlign ;	u_short    wBitsPerSample ;} WAVEFORMAT ;typedef  struct{	char    	RiffID [4] ;	u_long    	RiffSize ;	char    	WaveID [4] ;	char    	FmtID  [4] ;	u_long    	FmtSize ;	u_short   	wFormatTag ;	u_short   	nChannels ;	u_long		nSamplesPerSec ;	u_long		nAvgBytesPerSec ;	u_short		nBlockAlign ;	u_short		wBitsPerSample ;	u_short		fmtadd;	char		FactID[4];	u_long	FactSize;	char		DataID [4] ;	u_long		nDataBytes ;} WAVE_HEADER ;/*=================================================================================================*/char*  findchunk (char* s1, char* s2, size_t n) ;/*=================================================================================================*/static  WAVE_HEADER  waveheader ={	{ 'R', 'I', 'F', 'F' },		0,	{ 'W', 'A', 'V', 'E' },	{ 'f', 'm', 't', ' ' },		18,								/* FmtSize*/		PCM_WAVE_FORMAT,						/* wFormatTag*/		0,								/* nChannels*/		0,		0,		0,		0,		0,	{ 'd', 'a', 't', 'a' },		0} ; /* waveheader*/int  WaveWriteHeader (int wavefile, int channels, u_long samplerate, int sampbits, u_long samples){ 	u_long		databytes ;	u_short		blockalign ;	if ( wavefile < 0 ) {		printf("Invalid file descriptor");		return WW_BADOUTPUTFILE ;	}	sampbits   = 8;	blockalign = channels ;	databytes  = samples * (u_long) blockalign ;	waveheader.RiffSize 	   = sizeof (WAVE_HEADER) + databytes - 8 ;	waveheader.wFormatTag      = PCM_WAVE_FORMAT ;	waveheader.nChannels       = channels ;	waveheader.nSamplesPerSec  = samplerate ;	waveheader.nAvgBytesPerSec = samplerate * (u_long) blockalign ;	waveheader.nBlockAlign     = blockalign;	waveheader.wBitsPerSample  = sampbits;	waveheader.nDataBytes      = databytes;	if (write (wavefile, &waveheader, sizeof (WAVE_HEADER)) != sizeof (WAVE_HEADER)) {		printf("error");	/* wwg: report the error */		return  WW_BADWRITEHEADER ;	}  return 0 ;} ; /* WaveWriteHeader*/int  WaveReadHeader  (int wavefile, int* channels, u_long* samplerate, int* samplebits, u_long* samples, u_long* datastart){	static  WAVEFORMAT  waveformat ;	static	char   buffer [ BUFFERSIZE ] ;		/* Function is not reentrant.*/	char*   ptr ;	u_long  databytes ;	if (lseek (wavefile, 0L, SEEK_SET)) {		printf("error");		/* wwg: Report error */		return  WR_BADSEEK ;	}	read (wavefile, buffer, BUFFERSIZE) ;	if (! findchunk (buffer, "RIFF", BUFFERSIZE)) {		printf("Bad format: Cannot find RIFF file marker");	return  WR_BADRIFF ;	} 	if (! findchunk (buffer, "WAVE", BUFFERSIZE)) {		printf("Bad format: Cannot find WAVE file marker");	/* wwg: report error */	return  WR_BADWAVE ;	}	ptr = findchunk (buffer, "fmt ", BUFFERSIZE) ;	if (! ptr) {		printf("Bad format: Cannot find 'fmt' file marker");	/* wwg: report error */	return  WR_BADFORMAT ;	}	ptr += 4 ;	/* Move past "fmt ".*/	memcpy (&waveformat, ptr, sizeof (WAVEFORMAT)) ;	if (waveformat.dwSize < (sizeof (WAVEFORMAT) - sizeof (u_long))) {		printf("Bad format: Bad fmt size");			/* wwg: report error */		return  WR_BADFORMATSIZE ;	}	if (waveformat.wFormatTag != PCM_WAVE_FORMAT) {		printf("Only supports PCM wave format");			/* wwg: report error */		return  WR_NOTPCMFORMAT ;	}	ptr = findchunk (buffer, "data", BUFFERSIZE) ;	if (! ptr) {		printf("Bad format: unable to find 'data' file marker");	/* wwg: report error */		return  WR_NODATACHUNK ;	}	ptr += 4 ;	/* Move past "data".*/	memcpy (&databytes, ptr, sizeof (u_long)) ;	/* Everything is now cool, so fill in output data.*/	*channels   = waveformat.wChannels ;	*samplerate = waveformat.dwSamplesPerSec ;	*samplebits = waveformat.wBitsPerSample ;	*samples    = databytes / waveformat.wBlockAlign ;		*datastart  = ((u_long) (ptr + 4)) - ((u_long) (&(buffer[0]))) ;	if (waveformat.dwSamplesPerSec != waveformat.dwAvgBytesPerSec / waveformat.wBlockAlign) {		printf("Bad file format");			/* wwg: report error */		return  WR_BADFORMATDATA ;	}	if (waveformat.dwSamplesPerSec != waveformat.dwAvgBytesPerSec / waveformat.wChannels) {		printf("Bad file format");			/* wwg: report error */		return  WR_BADFORMATDATA ;	}  return  0 ;} ; /* WaveReadHeader*//*===========================================================================================*/char* findchunk  (char* pstart, char* fourcc, size_t n){	char	*pend ;	int		k, test ;	pend = pstart + n ;	while (pstart < pend)	{ 	if (*pstart == *fourcc)       /* found match for first char*/		{	test = TRUE ;			for (k = 1 ; fourcc [k] != 0 ; k++)				test = (test ? ( pstart [k] == fourcc [k] ) : FALSE) ;			if (test)				return  pstart ;			} ; /* if*/		pstart ++ ;		} ; /* while lpstart*/	return  NULL ;} ; /* findchuck*//* $Source: /home/cvs/wavplay/wavfile.c,v $ */

⌨️ 快捷键说明

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