typedef struct
{
DWORD dwRiff; // Type of file header.
DWORD dwSize; // Size of file header.
DWORD dwWave; // Type of wave.
} RIFF_FILEHEADER, *PRIFF_FILEHEADER;
// -----------------------------------------------------------------------------
// ChunkHeader
// -----------------------------------------------------------------------------
typedef struct
{
DWORD dwCKID; // Type Identification for current chunk header.
DWORD dwSize; // Size of current chunk header.
} RIFF_CHUNKHEADER, *PRIFF_CHUNKHEADER;
/* Chunk Types
*/
#define RIFF_FILE mmioFOURCC('R','I','F','F')
#define RIFF_WAVE mmioFOURCC('W','A','V','E')
#define RIFF_FORMAT mmioFOURCC('f','m','t',' ')
#define RIFF_CHANNEL mmioFOURCC('d','a','t','a')
towrite=CreateFile(param->filename,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,0,NULL);
if(towrite!=INVALID_HANDLE_VALUE)
{
RIFF_FILEHEADER FileHeader;
RIFF_CHUNKHEADER WaveHeader;
RIFF_CHUNKHEADER DataHeader;
DWORD dwBytesWritten;
WAVEFORMATEX pWFX;
pWFX.cbSize=0;
pWFX.wFormatTag=WAVE_FORMAT_PCM;
pWFX.nChannels=1;
pWFX.nSamplesPerSec=8000;
pWFX.wBitsPerSample=16;
pWFX.nAvgBytesPerSec = pWFX.nChannels * pWFX.nSamplesPerSec * pWFX.wBitsPerSample / 8;
pWFX.nBlockAlign =pWFX.wBitsPerSample * pWFX.nChannels / 8;
// Fill in the file, wave and data headers
WaveHeader.dwCKID = RIFF_FORMAT;
WaveHeader.dwSize = sizeof(WAVEFORMATEX) + pWFX.cbSize;
// the DataHeader chunk contains the audio data
DataHeader.dwCKID = RIFF_CHANNEL;
DataHeader.dwSize = param->len;
// The FileHeader
FileHeader.dwRiff = RIFF_FILE;
FileHeader.dwWave = RIFF_WAVE;
FileHeader.dwSize = sizeof(FileHeader)+ sizeof(WaveHeader)+sizeof(DataHeader)+ DataHeader.dwSize-8;
SetFilePointer(towrite,0,0,FILE_BEGIN);
WriteFile(towrite,&FileHeader,sizeof(RIFF_FILEHEADER),&rt,NULL);
WriteFile(towrite,&WaveHeader,sizeof(RIFF_CHUNKHEADER),&rt,NULL);
WriteFile(towrite,&pWFX,WaveHeader.dwSize,&rt,NULL);
WriteFile(towrite,&DataHeader,sizeof(RIFF_CHUNKHEADER),&rt,NULL);
if( !WriteFile(towrite,param->data,param->len,&rt,NULL))
{
log_to_file("FlushData/tWriteFile Failed");
}
CloseHandle(towrite);
}