⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 childview.cpp

📁 声音处理程序,通过FFT可以看声音的频谱.
💻 CPP
字号:
// ChildView.cpp : implementation of the CChildView class
//

#include "stdafx.h"
#include "Vib.h"
//#include "ChildView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CChildView

CChildView::CChildView()
{
	m_hWaveIn=NULL;
	m_bRestart=FALSE;
}

CChildView::~CChildView()
{
}


BEGIN_MESSAGE_MAP(CChildView,CWnd)
	//{{AFX_MSG_MAP(CChildView)
	ON_WM_PAINT()
	ON_WM_CREATE()
	ON_MESSAGE(MM_WIM_DATA,OnMM_WIM_DATA)
	ON_MESSAGE(MM_WIM_CLOSE,OnMM_WIM_CLOSE)
	ON_MESSAGE(MM_WOM_OPEN,OnMM_WOM_OPEN)
	ON_MESSAGE(MM_WOM_DONE,OnMM_WOM_DONE)
	ON_MESSAGE(MM_WOM_CLOSE,OnMM_WOM_CLOSE)
	ON_WM_DESTROY()
	ON_COMMAND(ID_FILE_ENVELOP, OnFileEnvelop)
	ON_COMMAND(ID_FILE_PAUSE, OnFilePause)
	ON_UPDATE_COMMAND_UI(ID_FILE_PAUSE, OnUpdateFilePause)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CChildView message handlers

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
{
	if (!CWnd::PreCreateWindow(cs))
		return FALSE;

	cs.dwExStyle |= WS_EX_CLIENTEDGE;
	cs.style &= ~WS_BORDER;
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
		::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);

	return TRUE;
}

void CChildView::OnPaint() 
{
	// TODO: Add your message handler code here
	CPaintDC dc(this); // device context for painting
	CRect rectClient;
	GetClientRect(&rectClient);
	theApp.DrawWave(&dc,rectClient);
	return;
}


int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd ::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	theApp.m_pView=this;

	StartWave();

	return 0;
}

void CChildView::OnMM_WIM_DATA(UINT wParam,LONG lParam)
{
	static DWORD nTickEnd=0;
	if(::GetTickCount()<nTickEnd)StopWave(TRUE);
	else if(m_hWaveIn)
	{
		PWAVEHDR pHdr=(PWAVEHDR)lParam;
		PSHORT pData=(PSHORT)pHdr->lpData;
		int nSize=pHdr->dwBytesRecorded/2;
		::waveInAddBuffer(m_hWaveIn,pHdr,sizeof (WAVEHDR));
		if(!theApp.m_bPause)
		{
			theApp.ReadWave(pData,nSize);
			Invalidate(FALSE);
		}
		nTickEnd=::GetTickCount()+10;
	}
}

void CChildView::OnMM_WIM_CLOSE(UINT wParam,LONG lParam)
{
	//MessageBox("WinClose");
}

void CChildView::OnMM_WOM_OPEN(UINT wParam,LONG lParam)
{   
	MessageBox("WomOpen");
}

void CChildView::OnMM_WOM_DONE(UINT wParam,LONG lParam)
{  
	MessageBox("WomDone");

}
void CChildView::OnMM_WOM_CLOSE(UINT wParam,LONG lParam)
{
	MessageBox("WomClose");
}

void CChildView::OnDestroy() 
{
	CWnd ::OnDestroy();
	
	// TODO: Add your message handler code here
	//StopWave();
}

void CChildView::StartWave(BOOL bRestart)
{
	if(!bRestart)
	{
		m_WaveInHdr1=new WAVEHDR;
		m_WaveInHdr2=new WAVEHDR;
		m_pWaveInBuffer1=new BYTE[theApp.m_nFFTPoint*2];
		m_pWaveInBuffer2=new BYTE[theApp.m_nFFTPoint*2];

		m_WaveformIn.wFormatTag=WAVE_FORMAT_PCM;
		m_WaveformIn.wBitsPerSample=16;
		m_WaveformIn.cbSize=0;
		m_WaveformIn.nChannels=1;
		m_WaveformIn.nSamplesPerSec=theApp.m_nSampleFreq;//采样频率
		m_WaveformIn.nBlockAlign=m_WaveformIn.nChannels*m_WaveformIn.wBitsPerSample/8;
		m_WaveformIn.nAvgBytesPerSec=m_WaveformIn.nSamplesPerSec*m_WaveformIn.nBlockAlign;
		
		m_WaveInHdr1->dwBufferLength=theApp.m_nFFTPoint*2;
		m_WaveInHdr1->dwBytesRecorded=0;
		m_WaveInHdr1->dwUser=0;
		m_WaveInHdr1->dwFlags=0;
		m_WaveInHdr1->dwLoops=1;
		m_WaveInHdr1->lpNext=NULL;
		m_WaveInHdr1->reserved=0;
		*m_WaveInHdr2=*m_WaveInHdr1;
		m_WaveInHdr1->lpData=(LPTSTR)m_pWaveInBuffer1;
		m_WaveInHdr2->lpData=(LPTSTR)m_pWaveInBuffer2;
	}

	//打开录音设备函数 
	HWAVEIN hWaveIn=NULL;
	MMRESULT s;
	s=::waveInOpen(&hWaveIn,WAVE_MAPPER,&m_WaveformIn,(DWORD)m_hWnd,NULL,CALLBACK_WINDOW);
	if(Msg(s))return;
	s=::waveInPrepareHeader(hWaveIn,m_WaveInHdr1,sizeof(WAVEHDR));
	if(Msg(s))return;
	s=::waveInPrepareHeader(hWaveIn,m_WaveInHdr2,sizeof(WAVEHDR));
	if(Msg(s))return;
	s=::waveInAddBuffer(hWaveIn,m_WaveInHdr1,sizeof(WAVEHDR));
	if(Msg(s))return;
	s=::waveInAddBuffer(hWaveIn,m_WaveInHdr2,sizeof(WAVEHDR));
	if(Msg(s))return;
	s=::waveInStart(hWaveIn);
	if(Msg(s))return;
	m_hWaveIn=hWaveIn;
}

void CChildView::StopWave(BOOL bRestart)
{
	if(m_hWaveIn)
	{
		HWAVEIN hWaveIn=m_hWaveIn;
		MMRESULT s;
		m_hWaveIn=NULL;
		s=::waveInReset(hWaveIn);
		if(Msg(s))return;
		s=::waveInStop(hWaveIn);
		if(Msg(s))return;
		s=::waveInUnprepareHeader(hWaveIn, m_WaveInHdr1, sizeof(WAVEHDR));
		if(Msg(s))return;
		s=::waveInUnprepareHeader(hWaveIn, m_WaveInHdr2, sizeof(WAVEHDR));
		if(Msg(s))return;
		s=::waveInClose(hWaveIn);
		if(Msg(s))return;
		if(!bRestart)
		{
			delete[] m_WaveInHdr1;
			delete[] m_WaveInHdr2;
			delete[] m_pWaveInBuffer1;
			delete[] m_pWaveInBuffer2;
		}
		else m_bRestart=TRUE;
	}
}


BOOL CChildView::Msg(MMRESULT s)
{
	if(s!=MMSYSERR_NOERROR)
	{
		int nCnt=256;
		TCHAR szText[256];
		::waveInGetErrorText(s,szText,nCnt);
		MessageBox(szText);
		return TRUE;
	}
	return FALSE;
}

void CChildView::OnFilePrintPreview() 
{
	// TODO: Add your command handler code here
	//CView::OnFilePrintPreview();
}

void CChildView::OnFileEnvelop() 
{
	// TODO: Add your command handler code here
	CEnvelop dlg;
	dlg.DoModal();
}

void CChildView::OnFilePause() 
{
	// TODO: Add your command handler code here
	theApp.SetPause(!theApp.m_bPause);
}

void CChildView::OnUpdateFilePause(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(theApp.m_bPause);	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -