www.pudn.com > WinGOS.rar > 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); 
	} 
}