📄 waveaudio.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 + -