📄 stdafx.cpp
字号:
// stdafx.cpp : 只包括标准包含文件的源文件
// WinGOS.pch 将成为预编译头
// stdafx.obj 将包含预编译类型信息
#include "stdafx.h"
// TODO: 在 STDAFX.H 中
//引用任何所需的附加头文件,而不是在此文件中引用
WinAudioWave g_AW;
void CALLBACK WinAudioWave::WaveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
PWAVEHDR pHdr;
switch(uMsg)
{
case MM_WIM_DATA:
if(!g_AW.m_hWI)
break;
pHdr=(PWAVEHDR)dwParam1;
WriteFile(g_AW.m_hFile,pHdr->lpData,pHdr->dwBufferLength,&dwParam1,NULL);
waveInAddBuffer(hwi,pHdr,sizeof(WAVEHDR));
break;
}
}
void CALLBACK WinAudioWave::WaveOutProc(HWAVEOUT hwo,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
PWAVEHDR pHdr;
switch(uMsg)
{
case MM_WOM_DONE:
if(!g_AW.m_hWO)
break;
pHdr=(PWAVEHDR)dwParam1;
ReadFile(g_AW.m_hFile,pHdr->lpData,pHdr->dwBufferLength,&dwParam1,NULL);
if(!dwParam1)
SetFilePointer(g_AW.m_hFile,0,NULL,FILE_BEGIN);
waveOutWrite(hwo,pHdr,sizeof(WAVEHDR));
break;
}
}
BOOL WinAudioWave::Msg(MMRESULT s)
{
if(s!=MMSYSERR_NOERROR)
{
int nCnt=256;
TCHAR szText[256];
::waveInGetErrorText(s,szText,nCnt);
MessageBox(NULL,szText,NULL,MB_OK);
return TRUE;
}
return FALSE;
}
void WinAudioWave::InitARG()
{
ZeroMemory(this,sizeof(WinAudioWave));
m_wh1.lpData=(LPSTR)m_aBuf1;
m_wh1.dwBufferLength=sizeof(m_aBuf1);
m_wh1.dwLoops=1;
m_wh2.lpData=(LPSTR)m_aBuf2;
m_wh2.dwBufferLength=sizeof(m_aBuf2);
m_wh2.dwLoops=1;
m_wf.wFormatTag=WAVE_FORMAT_PCM;
m_wf.wBitsPerSample=16;
m_wf.nSamplesPerSec=WaveSamplesPerSec;
m_wf.nChannels=2;
m_wf.nBlockAlign=m_wf.nChannels*m_wf.wBitsPerSample/8;
m_wf.nAvgBytesPerSec=m_wf.nSamplesPerSec*m_wf.nBlockAlign;
}
BOOL WinAudioWave::Record(LPCTSTR pszFile)
{
MMRESULT s;
InitARG();
m_hFile = CreateFile(pszFile,GENERIC_WRITE,
0,NULL,CREATE_ALWAYS,0,NULL);
if(m_hFile==INVALID_HANDLE_VALUE)
return FALSE;
s=waveInOpen(&m_hWI,WAVE_MAPPER,&m_wf,(DWORD)WaveInProc,NULL,CALLBACK_FUNCTION);
if(Msg(s))return FALSE;
s=waveInPrepareHeader(m_hWI,&m_wh1,sizeof(WAVEHDR));
s=waveInPrepareHeader(m_hWI,&m_wh2,sizeof(WAVEHDR));
s=waveInAddBuffer(m_hWI,&m_wh1,sizeof(WAVEHDR));
s=waveInAddBuffer(m_hWI,&m_wh2,sizeof(WAVEHDR));
s=waveInStart(m_hWI);
return TRUE;
}
BOOL WinAudioWave::Play(LPCTSTR pszFile)
{
MMRESULT s;
DWORD nSize;
InitARG();
m_hFile = CreateFile(pszFile,GENERIC_READ,
0,NULL,OPEN_EXISTING,0,NULL);
if(m_hFile==INVALID_HANDLE_VALUE)
return FALSE;
s=waveOutOpen(&m_hWO,WAVE_MAPPER,&m_wf,(DWORD)WaveOutProc,NULL,CALLBACK_FUNCTION);
if(Msg(s))return FALSE;
s=waveOutPrepareHeader(m_hWO,&m_wh1,sizeof(WAVEHDR));
s=waveOutPrepareHeader(m_hWO,&m_wh2,sizeof(WAVEHDR));
nSize=m_wh1.dwBufferLength;
ReadFile(m_hFile,m_wh1.lpData,nSize,&nSize,NULL);
s=waveOutWrite(m_hWO,&m_wh1,sizeof(WAVEHDR));
nSize=m_wh2.dwBufferLength;
ReadFile(m_hFile,m_wh2.lpData,nSize,&nSize,NULL);
s=waveOutWrite(m_hWO,&m_wh2,sizeof(WAVEHDR));
return TRUE;
}
void WinAudioWave::StopRecord()
{
if(m_hWI)
{
HWAVEIN h=m_hWI;
m_hWI=NULL;
waveInReset(h);
}
if(m_hFile && m_hFile!=INVALID_HANDLE_VALUE)
{
CloseHandle(m_hFile);
}
}
void WinAudioWave::StopPlay()
{
if(m_hWO)
{
HWAVEOUT h=m_hWO;
m_hWO=NULL;
waveOutReset(h);
}
if(m_hFile && m_hFile!=INVALID_HANDLE_VALUE)
{
CloseHandle(m_hFile);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -