2024-06-23 17:36:53 +08:00

126 lines
3.2 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// SoundToWav.cpp: implementation of the CSoundToWav class.
//
//////////////////////////////////////////////////////////////////////
#include "..\stdafx.h"
#include "..\Client.h"
#include "SoundToWav.h"
#include <ASSERT.H>
#include <AVIRIFF.H>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
static const DWORD WAVE_FILE_HEAD_SIZE = sizeof(RIFFLIST) + sizeof(RIFFCHUNK) + sizeof(WAVEFORMATEX) + sizeof(RIFFCHUNK);
extern DWORD g_dwLastError;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSoundToWav::CSoundToWav()
{
m_hFile=INVALID_HANDLE_VALUE;
m_dwTotalBytes = 0;
ZeroMemory(&m_wfx,sizeof(WAVEFORMATEX));
m_wfx.wFormatTag = WAVE_FORMAT_PCM;//声音格式为PCM
m_wfx.nSamplesPerSec = 8000;//采样率16000次/秒
m_wfx.wBitsPerSample = 16;//采样比特16bits/次
m_wfx.nChannels = 1;//采样声道数2声道
m_wfx.nBlockAlign = m_wfx.wBitsPerSample*m_wfx.nChannels/8;//一个块的大小采样bit的字节数乘以声道数
m_wfx.nAvgBytesPerSec = m_wfx.nBlockAlign*m_wfx.nSamplesPerSec ;//每秒的数据率,就是每秒能采集多少字节的数据
m_wfx.cbSize = 0;//一般为0
}
CSoundToWav::~CSoundToWav()
{
if (m_hFile!=INVALID_HANDLE_VALUE)
{
CloseHandle(m_hFile);
}
}
void CSoundToWav::SetWaveFormat(WAVEFORMATEX *pwfx)
{
CopyMemory(&m_wfx,pwfx,sizeof(WAVEFORMATEX));
}
DWORD CSoundToWav::WriteWavFileHeader()
{
BYTE Buffer[WAVE_FILE_HEAD_SIZE];
RIFFLIST *pRiffWave = (RIFFLIST *)Buffer;
RIFFCHUNK *pRiffFmt = (RIFFCHUNK *)(pRiffWave + 1);
RIFFCHUNK *pRiffData = (RIFFCHUNK *)(((BYTE *)(pRiffFmt + 1)) + sizeof(WAVEFORMATEX));
pRiffData->fcc = FCC('data');
pRiffData->cb = m_dwTotalBytes;
pRiffFmt->fcc = FCC('fmt ');
pRiffFmt->cb = sizeof(WAVEFORMATEX);
CopyMemory(pRiffFmt + 1, &m_wfx, sizeof(WAVEFORMATEX));
pRiffWave->fcc = FCC('RIFF');
pRiffWave->cb = m_dwTotalBytes + WAVE_FILE_HEAD_SIZE - sizeof(RIFFCHUNK);
pRiffWave->fccListType = FCC('WAVE');
SetFilePointer(m_hFile, 0, NULL, FILE_BEGIN);
DWORD dwWriten = 0;
BOOL bRet = WriteFile(m_hFile, Buffer, WAVE_FILE_HEAD_SIZE, &dwWriten, NULL);
if ((bRet == FALSE) || (dwWriten != WAVE_FILE_HEAD_SIZE))
{
return -1;
}
return 0;
}
DWORD CSoundToWav::WriteWavData(LPBYTE pData,DWORD nSize)
{
DWORD nByteWrite = Write(pData,nSize);
m_dwTotalBytes+=nByteWrite;
return nByteWrite;
}
BOOL CSoundToWav::close( )
{
if (m_hFile!=INVALID_HANDLE_VALUE)
{
CloseHandle(m_hFile);
}
return TRUE;
}
BOOL CSoundToWav::Open(LPCTSTR lpFileName,DWORD dwDesiredAccess)
{
m_hFile = CreateFile(lpFileName,dwDesiredAccess,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
return m_hFile!=INVALID_HANDLE_VALUE ? TRUE:FALSE;
}
DWORD CSoundToWav::SeekToBegin( )
{
assert(m_hFile!=INVALID_HANDLE_VALUE);
return SetFilePointer(m_hFile,0,NULL,FILE_BEGIN);
}
DWORD CSoundToWav::SeekToEnd( )
{
assert(m_hFile!=INVALID_HANDLE_VALUE);
return SetFilePointer(m_hFile,0,NULL,FILE_END);
}
DWORD CSoundToWav::Write(LPVOID lpBuffer,DWORD nNumberOfBytesToWrite)
{
assert(m_hFile!=INVALID_HANDLE_VALUE);
DWORD dwNumberOfBytesWrite;
WriteFile(m_hFile,lpBuffer,nNumberOfBytesToWrite,&dwNumberOfBytesWrite,NULL);
return dwNumberOfBytesWrite;
}