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

📄 wav.c

📁 刻录光盘的程序
💻 C
字号:
/* @(#)wav.c	1.2 99/12/19 Copyright 1998,1999 Heiko Eissfeldt */#ifndef lintstatic char     sccsid[] ="@(#)wav.c	1.2 99/12/19 Copyright 1998,1999 Heiko Eissfeldt";#endif/*** * CopyPolicy: GNU Public License 2 applies * Copyright (C) by Heiko Eissfeldt * * */#include "config.h"#include <stdio.h>#if defined (HAVE_UNISTD_H) && (HAVE_UNISTD_H == 1)#include <sys/types.h>#include <unistd.h>#endif#include "byteorder.h"#include "sndfile.h"/*** * --------------------------------------------------------------------- *  definitions for RIFF-output (from windows MMSYSTEM) * --------------------------------------------------------------------- */typedef unsigned int FOURCC;	/* a four character code */typedef struct CHUNKHDR {  FOURCC ckid;		/* chunk ID */  unsigned int dwSize; 	/* chunk size */} CHUNKHDR;/* flags for 'wFormatTag' field of WAVEFORMAT */#define WAVE_FORMAT_PCM 1/* specific waveform format structure for PCM data */typedef struct pcmwaveformat_tag {  unsigned short wFormatTag;	/* format type */  unsigned short nChannels;	/* number of channels (i.e. mono, stereo, etc.) */  unsigned int nSamplesPerSec; /* sample rate */  unsigned int nAvgBytesPerSec;/* for buffer size estimate */  unsigned short nBlockAlign;	/* block size of data */  unsigned short wBitsPerSample;} PCMWAVEFORMAT;typedef PCMWAVEFORMAT *PPCMWAVEFORMAT;/* MMIO macros */#define mmioFOURCC(ch0, ch1, ch2, ch3) \  ((unsigned int)(unsigned char)(ch0) | ((unsigned int)(unsigned char)(ch1) << 8) | \  ((unsigned int)(unsigned char)(ch2) << 16) | ((unsigned int)(unsigned char)(ch3) << 24))#define FOURCC_RIFF	mmioFOURCC ('R', 'I', 'F', 'F')#define FOURCC_LIST	mmioFOURCC ('L', 'I', 'S', 'T')#define FOURCC_WAVE	mmioFOURCC ('W', 'A', 'V', 'E')#define FOURCC_FMT	mmioFOURCC ('f', 'm', 't', ' ')#define FOURCC_DATA	mmioFOURCC ('d', 'a', 't', 'a')/* simplified Header for standard WAV files */typedef struct WAVEHDR {  CHUNKHDR chkRiff;  FOURCC fccWave;  CHUNKHDR chkFmt;  unsigned short wFormatTag;	/* format type */  unsigned short nChannels;	/* number of channels (i.e. mono, stereo, etc.) */  unsigned int nSamplesPerSec; /* sample rate */  unsigned int nAvgBytesPerSec;/* for buffer estimation */  unsigned short nBlockAlign;	/* block size of data */  unsigned short wBitsPerSample;  CHUNKHDR chkData;} WAVEHDR;#define IS_STD_WAV_HEADER(waveHdr) ( \  waveHdr.chkRiff.ckid == FOURCC_RIFF && \  waveHdr.fccWave == FOURCC_WAVE && \  waveHdr.chkFmt.ckid == FOURCC_FMT && \  waveHdr.chkData.ckid == FOURCC_DATA && \  waveHdr.wFormatTag == WAVE_FORMAT_PCM)static WAVEHDR waveHdr;static int _InitSound __PR(( int audio, long channels, unsigned long rate, long nBitsPerSample, unsigned long expected_bytes ));static int _InitSound ( audio , channels , rate , nBitsPerSample , expected_bytes )	int audio;	long channels;	unsigned long rate;	long nBitsPerSample;	unsigned long expected_bytes;{  unsigned long nBlockAlign = channels * ((nBitsPerSample + 7) / 8);  unsigned long nAvgBytesPerSec = nBlockAlign * rate;  unsigned long temp = expected_bytes + sizeof(WAVEHDR) - sizeof(CHUNKHDR);  waveHdr.chkRiff.ckid    = cpu_to_le32(FOURCC_RIFF);  waveHdr.fccWave         = cpu_to_le32(FOURCC_WAVE);  waveHdr.chkFmt.ckid     = cpu_to_le32(FOURCC_FMT);  waveHdr.chkFmt.dwSize   = cpu_to_le32(sizeof (PCMWAVEFORMAT));  waveHdr.wFormatTag      = cpu_to_le16(WAVE_FORMAT_PCM);  waveHdr.nChannels       = cpu_to_le16(channels);  waveHdr.nSamplesPerSec  = cpu_to_le32(rate);  waveHdr.nBlockAlign     = cpu_to_le16(nBlockAlign);  waveHdr.nAvgBytesPerSec = cpu_to_le32(nAvgBytesPerSec);  waveHdr.wBitsPerSample  = cpu_to_le16(nBitsPerSample);  waveHdr.chkData.ckid    = cpu_to_le32(FOURCC_DATA);  waveHdr.chkRiff.dwSize  = cpu_to_le32(temp);  waveHdr.chkData.dwSize  = cpu_to_le32(expected_bytes);  return write (audio, &waveHdr, sizeof (waveHdr));}static int _ExitSound __PR(( int audio, unsigned long nBytesDone ));static int _ExitSound ( audio , nBytesDone )	int audio;	unsigned long nBytesDone;{  unsigned long temp = nBytesDone + sizeof(WAVEHDR) - sizeof(CHUNKHDR);  waveHdr.chkRiff.dwSize = cpu_to_le32(temp);  waveHdr.chkData.dwSize = cpu_to_le32(nBytesDone);  /* goto beginning */  if (lseek(audio, 0L, SEEK_SET) == -1) {    return 0;  }  return write (audio, &waveHdr, sizeof (waveHdr));}static unsigned long _GetHdrSize __PR(( void ));static unsigned long _GetHdrSize( ){  return sizeof( waveHdr );}struct soundfile wavsound ={	_InitSound,		/* init header method */	_ExitSound,		/* exit header method */	_GetHdrSize,		/* report header size method */	0			/* needs big endian samples */};

⌨️ 快捷键说明

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