📄 wavint.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 + -