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

📄 waveaudio.cpp

📁 本组件是一个集录音
💻 CPP
字号:
// WaveAudio.cpp : Implementation of CWaveAudio

#include "stdafx.h"
#include "AudioActiveX.h"
#include "WaveAudio.h"
#include <math.h>
/////////////////////////////////////////////////////////////////////////////
// CWaveAudio


STDMETHODIMP CWaveAudio::Load(BSTR Filename)
{
	// TODO: Add your implementation code here
	Close();
	MCI_OPEN_PARMS OpenParms;
	OpenParms.lpstrDeviceType = "waveaudio";	//设置参数
	USES_CONVERSION;
	OpenParms.lpstrElementName = OLE2T(Filename);

	if (mciSendCommand(NULL,MCI_OPEN, MCI_OPEN_ELEMENT | MCI_OPEN_TYPE,
		(DWORD)(LPVOID)&OpenParms ))
	{
		return FALSE;
	}
	m_wDeviceID = OpenParms.wDeviceID;
	m_bOpened = TRUE;
	return S_OK;
}
//
//
//
STDMETHODIMP CWaveAudio::Record()
{
	// TODO: Add your implementation code here
	Close();
	MCI_OPEN_PARMS OpenParms;
	OpenParms.lpstrDeviceType = "waveaudio";
	OpenParms.lpstrElementName = "";
	if (mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | 
		MCI_WAIT, (DWORD)(LPVOID)&OpenParms))
	{
		return FALSE;
	}
	m_wDeviceID = OpenParms.wDeviceID;

	MCI_RECORD_PARMS RecordParms;
	if (mciSendCommand(m_wDeviceID, MCI_RECORD, NULL, (DWORD)(LPVOID)&RecordParms))
	{
		return FALSE;
	}

	m_bRecording = TRUE;
	m_bOpened = TRUE;


	return S_OK;
}
//
//
//
STDMETHODIMP CWaveAudio::Stop()
{
	// TODO: Add your implementation code here
	mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);
	return S_OK;
}

STDMETHODIMP CWaveAudio::Play()
{
	// TODO: Add your implementation code here
	Stop();
	MCI_PLAY_PARMS PlayParms;
	mciSendCommand(m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
	if (mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&PlayParms))
	{
		return FALSE;
	}
	else
	{
		return TRUE;
	}
	return S_OK;
}

STDMETHODIMP CWaveAudio::Close()
{
	// TODO: Add your implementation code here
	m_bRecording = FALSE;
	m_bOpened = FALSE;
	if (m_wDeviceID)	
	{
		mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);	//停止
		mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);		//关闭
	}
	m_wDeviceID = 0;
	return S_OK;
}

STDMETHODIMP CWaveAudio::Save(BSTR Filename)
{
	// TODO: Add your implementation code here
	if (! m_bRecording)
	{
		return FALSE;
	}
	Stop();
	MCI_SAVE_PARMS SaveParms;

	USES_CONVERSION; 
	//SaveParms.lpfilename = (LPCSTR)Filename;
	SaveParms.lpfilename = OLE2T(Filename);

	if (mciSendCommand(m_wDeviceID, MCI_SAVE, MCI_SAVE_FILE  | 
		MCI_WAIT, (DWORD)(LPVOID)&SaveParms))
	{
		return FALSE;
	}

	m_bRecording = FALSE;
	Load(Filename);

	return S_OK;

}

STDMETHODIMP CWaveAudio::WaveCompare(BSTR Sourcefile, BSTR Recordfile, float *argu)
{
	// TODO: Add your implementation code here
	_bstr_t S1 = Sourcefile;
	_bstr_t	S2 = Recordfile;
	char * Sourcefile1 = S1;
	char * Sourcefile2 = S2;
	HMMIO h1;
	HMMIO h2;
	MMCKINFO mmParent1, mmSub1;
	MMCKINFO mmParent2, mmSub2;
	GLOBALHANDLE gh1;
	GLOBALHANDLE gh2;
	PCMWAVEFORMAT waveformat1;
	PCMWAVEFORMAT waveformat2;
	char *p1;
	char *p2;
	unsigned long nextsample;
	long afactor;
	 int  n1;
	 int  n2;
	 int  i;

	if ((h1 = mmioOpen(Sourcefile1, NULL, MMIO_READ)) == NULL || 
		(h2 = mmioOpen(Sourcefile2, NULL, MMIO_READ)) == NULL)
	{
		//MessageBox(NULL,"打开文件出错",NULL,MB_OK);
		
		return S_FALSE;
	}


	//into wave location
	//file1
	mmParent1.fccType = mmioFOURCC('W', 'A', 'V', 'E');
	mmParent2.fccType = mmioFOURCC('W', 'A', 'V', 'E');
	if (mmioDescend(h1, (LPMMCKINFO)&mmParent1, NULL, MMIO_FINDRIFF) || 
		mmioDescend(h2, (LPMMCKINFO)&mmParent2, NULL, MMIO_FINDRIFF))
	{
		mmioClose(h1, 0);
		mmioClose(h2, 0);

		//MessageBox(NULL,"进入wave出错!",NULL,MB_OK);

		return S_FALSE;
	}

	//into fmt location
	//file1

	mmSub1.ckid = mmioFOURCC('f', 'm', 't', ' ');
	mmSub2.ckid = mmioFOURCC('f', 'm', 't', ' ');
	if (mmioDescend(h1, (LPMMCKINFO)&mmSub1, (LPMMCKINFO)&mmParent1, MMIO_FINDCHUNK) || 
		mmioDescend(h2, (LPMMCKINFO)&mmSub2, (LPMMCKINFO)&mmParent2, MMIO_FINDCHUNK))
	{
		mmioClose(h1, 0);
		mmioClose(h2, 0);
		//MessageBox(NULL,"进入fmt出错!",NULL,MB_OK);

		return S_FALSE;
	}

	//file1
	n1 = min((unsigned int)mmSub1.cksize, sizeof(PCMWAVEFORMAT));
	n2 = min((unsigned int)mmSub2.cksize, sizeof(PCMWAVEFORMAT));
	if ((mmioRead(h1, (LPSTR)&waveformat1, n1) != n1) || 
		(mmioRead(h2, (LPSTR)&waveformat2, n2) != n2))
	{
		mmioClose(h1, 0);
		mmioClose(h2, 0);
		//MessageBox(NULL,"读文件出错!",NULL,MB_OK);
		return S_FALSE;
	}
	if (waveformat1.wf.wFormatTag != WAVE_FORMAT_PCM || 
		waveformat2.wf.wFormatTag != WAVE_FORMAT_PCM)
	{
		mmioClose(h1, 0);
		mmioClose(h2, 0);
		return S_FALSE;
	}
	mmioAscend(h1, &mmSub1, 0);
	mmioAscend(h2, &mmSub2, 0);
	mmSub1.ckid = mmioFOURCC('d', 'a', 't', 'a');
	mmSub2.ckid = mmioFOURCC('d', 'a', 't', 'a');
	//////////////////////////////////
	if (mmioDescend(h1, (LPMMCKINFO)&mmSub1, (LPMMCKINFO)&mmParent1, MMIO_FINDCHUNK) ||  
		mmioDescend(h2, (LPMMCKINFO)&mmSub2, (LPMMCKINFO)&mmParent2, MMIO_FINDCHUNK))
	{
		mmioClose(h1, 0);
		//MessageBox(NULL,"进data出错!",NULL,MB_OK);
		return S_FALSE;
	}

	if ((gh1 = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, mmSub1.cksize)) == NULL || 
		(gh2 = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, mmSub2.cksize)) == NULL)
	{
		mmioClose(h1, 0);
		mmioClose(h2, 0);
		
		//MessageBox(NULL,"分配内存出错!",NULL,MB_OK);
		return S_FALSE;
	}
	if ((p1 = (char *)GlobalLock(gh1)) == NULL || 
		(p2 = (char *)GlobalLock(gh2)) == NULL)
	{
		GlobalFree(gh1);
		mmioClose(h1, 0);
		GlobalFree(gh2);
		mmioClose(h2, 0);
		return S_FALSE;
	}

	//p = new char[mmSub.cksize];//根据数据的大小申请缓冲区;
	//mmioSeek(h, 4, SEEK_CUR);
//	mmioRead(file1,(char*)pData,size);//读取声音数据;
	if (mmioRead(h1, p1, mmSub1.cksize) != mmSub1.cksize || 
		mmioRead(h2, p2, mmSub2.cksize) != mmSub2.cksize)	
	{
		GlobalUnlock(gh1);
		GlobalFree(gh1);
		mmioClose(h1, 0);
		return S_FALSE;
	}
	//
	//两个文件的参数是否相同,相同才可比,此默认相同
	//

	int s = 10; //声音文件的时间(秒)
	long SampleNumber = s * min(waveformat1.wf.nSamplesPerSec, waveformat2.wf.nSamplesPerSec);
	float rdf1_f2;
	float rdf1_f1;
	float rdf2_f2;
	float Relatedf1_f2;

	
	for (i = 0; i < SampleNumber ; )
	{
		if (waveformat1.wBitsPerSample == 8 && waveformat1.wf.nChannels == 1)
		{

			rdf1_f2 += p1[i] * p2[i];
			rdf1_f1 += p1[i] * p1[i];
			rdf2_f2 += p2[i] * p2[i];

			i += waveformat1.wf.nAvgBytesPerSec / waveformat1.wf.nSamplesPerSec * 2;

		}
		else if (waveformat1.wBitsPerSample == 8 && waveformat1.wf.nChannels == 2)
		{

			rdf1_f2 += p1[i] * p2[i];
			rdf1_f1 += p1[i] * p1[i];
			rdf2_f2 += p2[i] * p2[i];

			i += waveformat1.wf.nAvgBytesPerSec / waveformat1.wf.nSamplesPerSec * 2;

		}
		else if (waveformat1.wBitsPerSample == 16 && waveformat1.wf.nChannels == 1)
		{

			rdf1_f2 += p1[i] * p2[i];
			rdf1_f1 += p1[i] * p1[i];
			rdf2_f2 += p2[i] * p2[i];

			i += waveformat1.wf.nAvgBytesPerSec / waveformat1.wf.nSamplesPerSec * 2;

		}
		else if (waveformat1.wBitsPerSample == 16 && waveformat1.wf.nChannels == 2)
		{

			rdf1_f2 += p1[i] * p2[i];
			rdf1_f1 += p1[i] * p1[i];
			rdf2_f2 += p2[i] * p2[i];

			i += waveformat1.wf.nAvgBytesPerSec / waveformat1.wf.nSamplesPerSec * 2;

		}
	}
		
	//cout << "rdf1_f2=" << rdf1_f2 << endl;
	//cout << "rdf1_f1=" << rdf1_f1 << endl;
	//cout << "rdf2_f2=" << rdf2_f2 << endl;
	Relatedf1_f2 = rdf1_f2 /(sqrt(rdf1_f1) * sqrt(rdf2_f2));
	//cout << "Relatedf1_f2=" << Relatedf1_f2 << endl;
	*argu = Relatedf1_f2;
	return S_OK;
}

⌨️ 快捷键说明

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