www.pudn.com > AudioWave.rar > AudioDlg.cpp
// AudioDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Audio.h"
#include "AudioDlg.h"
#include "DialogFFTPara.h"
#include <math.h>
#define PI 3.1415926
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define LINESIZE 1
#define SCROLLLEN 10000
//#define COLORAXIS RGB(255,0,0)
#define COLORAXIS RGB(0,0,0) // axis
#define COLORSILENCE RGB(0,0,255)
#define COLORCONSONANT RGB(80,143,86)
#define COLORVOWEL RGB(255,255,0)
#define COLORVOWEL1 RGB(160,155,0)
#define COLORC_V RGB(0,255,255)
#define COLORNOTTEST RGB(255,0,255)
#define VIEW_WAVE_8 1
#define VIEW_WAVE_16 2
#define VIEW_FFT 3
#define VIEW_DCT 4
#define VIEW_SOUNDIN 5
// timer and it's flag
#define MY_TIMER_LENGTH 30 //ms
#define MY_TIMER_ARRIVE 11
#define MY_TIMER_SOUND 12
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAudioDlg dialog
CAudioDlg::CAudioDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAudioDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CAudioDlg)
m_bCheckColor = FALSE;
m_bCheckCycle = FALSE;
m_strEditAllTime = _T("");
m_nEditChannel = 0;
m_nEditPointPerSec = 0;
m_nEditPosition = 0;
m_nEditWholeLength = 0;
m_nEditZoomX = 1;
m_fEditZoomY = 4.0f;
m_nEditBit = 0;
m_dwEditOffSet = 0;
m_bCheckResult = FALSE;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_dwOffSet = m_dwEditOffSet;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CAudioDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAudioDlg)
DDX_Control(pDX, IDC_LIST_INFO, m_ListBox_Info);
DDX_Control(pDX, IDC_CHECK_RESULT, m_cCheckResult);
DDX_Control(pDX, IDC_STATIC_VIEW, m_cView);
DDX_Control(pDX, IDC_SCROLLBAR, m_cScrollBar);
DDX_Check(pDX, IDC_CHECK_COLOR, m_bCheckColor);
DDX_Check(pDX, IDC_CHECK_CYCLE, m_bCheckCycle);
DDX_Text(pDX, IDC_EDIT_ALL_TIME, m_strEditAllTime);
DDX_Text(pDX, IDC_EDIT_CHANNEL, m_nEditChannel);
DDX_Text(pDX, IDC_EDIT_POINT_PER_SEC, m_nEditPointPerSec);
DDX_Text(pDX, IDC_EDIT_POSITION, m_nEditPosition);
DDX_Text(pDX, IDC_EDIT_WHOLE_LENGTH, m_nEditWholeLength);
DDX_Text(pDX, IDC_EDIT_ZOOMX, m_nEditZoomX);
DDX_Text(pDX, IDC_EDIT_ZOOMY, m_fEditZoomY);
DDX_Control(pDX, IDC_MMCONTROL_AUDIO, m_cMci);
DDX_Text(pDX, IDC_EDIT_BIT, m_nEditBit);
DDX_Text(pDX, IDC_EDIT_OFFSET, m_dwEditOffSet);
DDX_Check(pDX, IDC_CHECK_RESULT, m_bCheckResult);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAudioDlg, CDialog)
//{{AFX_MSG_MAP(CAudioDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_COMMAND(ID_FILE_OPEN_AUDIO_WAVE, OnFileOpenAudioWave)
ON_BN_CLICKED(IDC_CHECK_CYCLE, OnCheckCycle)
ON_EN_CHANGE(IDC_EDIT_ZOOMX, OnChangeEditZoomx)
ON_EN_CHANGE(IDC_EDIT_ZOOMY, OnChangeEditZoomy)
ON_WM_HSCROLL()
ON_EN_CHANGE(IDC_EDIT_OFFSET, OnChangeEditOffset)
ON_WM_TIMER()
ON_COMMAND(ID_FILE_SAVE_AUDIO_WAVE, OnFileSaveAudioWave)
ON_COMMAND(ID_PROCESS_FFT, OnProcessFft)
ON_COMMAND(ID_PROCESS_FFT_I, OnProcessFftI)
ON_COMMAND(ID_OPTION_CHANGE_FFT_POWER, OnOptionChangeFftPower)
ON_BN_CLICKED(IDC_CHECK_RESULT, OnCheckResult)
ON_COMMAND(ID_PROCESS_LOWPASS, OnProcessLowpass)
ON_COMMAND(ID_PROCESS_DCTIV, OnProcessDctiv)
ON_COMMAND(ID_PROCESS_IDCTIV, OnProcessIdctiv)
ON_COMMAND(ID_SOUND_IN, OnSoundIn)
ON_COMMAND(ID_SOUND_IN_STOP, OnSoundInStop)
ON_COMMAND(ID_PITCH_DETECTOR, OnPitchDetector)
ON_COMMAND(ID_PITCH_DETECTOR_VOICE, OnPitchDetectorVoice)
ON_COMMAND(ID_PROCESS_HighPASS, OnPROCESSHighPASS)
ON_COMMAND(ID_SOUND_EMENDATION, OnSoundEmendation)
ON_COMMAND(ID_SOUND_IN_SQUARE, OnSoundInSquare)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAudioDlg message handlers
BOOL CAudioDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX &amt; 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_cView.GetClientRect(&amt;m_ClientRect);
m_pcSoundData = NULL;
m_pfSoundData = NULL;
m_pfRecData = NULL;
m_pdReFFT = NULL;
m_pdImFFT = NULL;
m_pfDCT = NULL;
m_nPower = 10;
m_bPlaying = FALSE;
InitDraw();
m_bTest = FALSE;
m_bSoundStart = FALSE;
m_shEmendation = 0; //初始校正值为0
m_nTestCount = 0;
m_cScrollBar.SetScrollRange(0,SCROLLLEN+1);
m_cScrollBar.EnableWindow(TRUE);
m_cScrollBar.SetScrollPos(0);
m_cCheckResult.EnableWindow(false);
return TRUE;
}
BOOL CAudioDlg::DestroyWindow()
{
if(m_pcSoundData != NULL) delete[] m_pcSoundData;
if(m_pfSoundData != NULL) delete[] m_pfSoundData;
if(m_pfRecData != NULL) delete[] m_pfRecData;
if(m_pdReFFT != NULL) delete[] m_pdReFFT;
if(m_pdImFFT != NULL) delete[] m_pdImFFT;
if(m_pfDCT != NULL) delete[] m_pfDCT;
return CDialog::DestroyWindow();
}
void CAudioDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID &amt; 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CAudioDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&amt;rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
// CRect tempRect;
// m_cView.GetClientRect(&amt;tempRect);
// CDC *pDC = GetDC();
// pDC->FillSolidRect(&amt;tempRect, RGB(255,255,255));
switch(m_nViewType) {
case VIEW_WAVE_8:
if(m_pfSoundData!=NULL)
{
DrawWave8bit(&amt;m_PenWave[0]);
}
break;
case VIEW_WAVE_16:
if(m_pfSoundData!=NULL)
{
DrawWave(&amt;m_PenWave[0]);
}
break;
case VIEW_FFT:
DrawWaveFFT_Energy();
break;
case VIEW_DCT:
DrawWaveDCT();
break;
case VIEW_SOUNDIN:
DrawSoundIn(&amt;m_PenWave[0]);
break;
default:
break;
}
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CAudioDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
char CAudioDlg::ChangeFormat(char t)
{/*波形数据形式 -1 to -128 and 127 to 0
char -128 to -1 and 0 to 127 */
if(t>=0)//总体上是关于128互补
{
return 127-t;
}else//if(t<0)
{
return -129-t;
}
}
char CAudioDlg::RestrictToChar(float t)
{//限定数据范围(char:-128 to 127)
if(t<-128)
{
return -128;
}else
{
if(t>127)
{
return 127;
}else
{
return(char(t));
}
}
}
short CAudioDlg::RestrictToShort(float t)
{//限定数据范围(short:-32768 to 32767)
if(t<-32768)
{
return -32768;
}else
{
if(t>32767)
{
return 32767;
}else
{
return(short(t));
}
}
}
void CAudioDlg::InitDraw()
{
CRect ViewRect;
m_cView.GetWindowRect(&amt;ViewRect);
m_nViewWidth = ViewRect.Width();
m_nViewHeight = ViewRect.Height();
m_PenAxis.CreatePen(PS_SOLID,1,COLORAXIS);
m_PenWave[0].CreatePen(PS_SOLID,1,COLORSILENCE);
m_PenWave[1].CreatePen(PS_SOLID,1,COLORCONSONANT);
m_PenWave[2].CreatePen(PS_SOLID,1,COLORVOWEL);
m_PenWave[3].CreatePen(PS_SOLID,1,COLORVOWEL1);
m_PenWave[4].CreatePen(PS_SOLID,1,COLORC_V);
m_PenWave[5].CreatePen(PS_SOLID,1,COLORNOTTEST);
}
void CAudioDlg::OnFileOpenAudioWave()
{
/* typedef struct {
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX;
m_WaveBase打开后可以给出 WAVEFORMATEX类型的m_WaveBase.m_WaveFormat结构,
他涉及数据采样类型的有用的信息;
m_WaveBase的成员DWORD m_dFileSize和DWORD m_dwDataSize给出数据的总长度;
*/
KillTimer(MY_TIMER_ARRIVE);
CFileDialog dlgOpenWave(TRUE);
dlgOpenWave.m_ofn.lpstrFilter = "声音文件(*.wav)\0*.wav\0\0";
int nAmplitude = (1<<14);
float fAllTime;
DWORD i;
if (dlgOpenWave.DoModal()==IDOK)
{
m_WaveBase.m_WaveFileName = dlgOpenWave.GetPathName();
m_strOriAudioFile = dlgOpenWave.GetPathName();
m_WaveBase.m_bFileExist = 1;
if(m_WaveBase.Wave_OpenFile())
{
// if(m_WaveBase.m_WaveFormat.nChannels!=1)
// { //单通道波形输入
// AfxMessageBox("目前只处理 ''单声道''波形信号 !");
// m_WaveBase.Wave_CloseReadFile();
// return;
// }
// if(m_WaveBase.m_WaveFormat.wBitsPerSample!=16)
// { //16bit采样
// AfxMessageBox("目前只处理 16bit/sample 的波形信号 !");
// m_WaveBase.Wave_CloseReadFile();
// return;
// }
}else
{
AfxMessageBox("文件打开错误");
m_WaveBase.Wave_CloseReadFile();
return;
}
m_dwSizeSound = m_WaveBase.m_dwDataSize;
m_nSamplesPerSec = m_WaveBase.m_WaveFormat.nSamplesPerSec;
m_wBitsPerSample = m_WaveBase.m_WaveFormat.wBitsPerSample;
if(m_pcSoundData!=NULL)
{
delete[] m_pcSoundData;
}
m_pcSoundData = new char[m_dwSizeSound];
m_WaveBase.Wave_ReadWaveData(m_pcSoundData, m_dwSizeSound);
m_WaveBase.Wave_CloseReadFile();
m_nEditChannel = m_WaveBase.m_WaveFormat.nChannels;
m_nEditBit = m_WaveBase.m_WaveFormat.wBitsPerSample;
m_nEditPointPerSec = m_nSamplesPerSec;
m_nEditWholeLength = (int)m_dwSizeSound/(m_nEditBit/8);
fAllTime = (float)m_nEditWholeLength/(float)m_nEditPointPerSec;
m_strEditAllTime.Format(">8.4f", fAllTime);
UpdateData(false);
if(m_pfSoundData!=NULL)
{
delete[] m_pfSoundData;
}
if(m_pfRecData!=NULL)
{
delete[] m_pfRecData;
}
m_pfSoundData = new float[m_dwSizeSound/(m_nEditBit/8)];
m_pfRecData = new float[m_dwSizeSound/(m_nEditBit/8)];
if(m_nEditBit==16)
{
m_nViewType = VIEW_WAVE_16;
short *pshSoundData = new short[m_dwSizeSound/(m_nEditBit/8)];
memcpy(pshSoundData, m_pcSoundData, m_dwSizeSound);
for(i=0; i<m_dwSizeSound/(m_nEditBit/8); i++)
{
m_pfSoundData[i] = pshSoundData[i];
}
delete[] pshSoundData;
}else if(m_nEditBit==8)
{
m_nViewType = VIEW_WAVE_8;
for(i=0; i<m_dwSizeSound/(m_nEditBit/8); i++)
{
m_pfSoundData[i] = (float)ChangeFormat(m_pcSoundData[i]);
}
}
memcpy(m_pfRecData, m_pfSoundData, m_dwSizeSound/(m_nEditBit/8)*sizeof(float));
m_cScrollBar.SetScrollPos(int(m_dwOffSet*1.0*SCROLLLEN*(m_nEditBit/8)/m_dwSizeSound),TRUE);
BrushRect();
m_bCheckResult = FALSE;
m_cCheckResult.EnableWindow(FALSE);
InitMci(); //初始化Mci
}
}
void CAudioDlg::OnFileSaveAudioWave()
{
if(m_pfSoundData==NULL)
{
AfxMessageBox("没有打开声音文件");
return;
}
char szFilters[] = "Wave声音文件 (*.wav)|*.wav|All Files (*.*)|*.*||";
CFileDialog dlgSaveWave (FALSE, "wav", "*.wav",
OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);
DWORD i;
if(dlgSaveWave.DoModal()==IDOK)
{
if(m_nEditBit==8)
{
for(i=0; i<m_dwSizeSound/(m_nEditBit/8); i++)
{
m_pcSoundData[i] = RestrictToChar(m_pfSoundData[i]);
m_pcSoundData[i] = ChangeFormat(m_pcSoundData[i]);
}
}else if(m_nEditBit==16)
{
short *pshSoundData = new short[m_dwSizeSound/(m_nEditBit/8)];
for(i=0; i<m_dwSizeSound/(m_nEditBit/8); i++)
{
pshSoundData[i] = RestrictToShort(m_pfSoundData[i]);
}
memcpy(m_pcSoundData, pshSoundData, m_dwSizeSound);
delete[] pshSoundData;
}
m_WaveBase.Wave_PrepareSaveFile(dlgSaveWave.GetPathName());
m_WaveBase.Wave_SaveWaveData(m_pcSoundData,m_dwSizeSound);
m_WaveBase.Wave_CloseSaveFile();
}
}
void CAudioDlg::SaveAudioWaveFile()
{
if(m_pfSoundData==NULL)
{
AfxMessageBox("没有打开声音文件");
return;
}
DWORD i;
if(m_nEditBit==8)
{
for(i=0; i<m_dwSizeSound/(m_nEditBit/8); i++)
{
m_pcSoundData[i] = RestrictToChar(m_pfSoundData[i]);
m_pcSoundData[i] = ChangeFormat(m_pcSoundData[i]);
}
}else if(m_nEditBit==16)
{
short *pshSoundData = new short[m_dwSizeSound/(m_nEditBit/8)];
for(i=0; i<m_dwSizeSound/(m_nEditBit/8); i++)
{
pshSoundData[i] = RestrictToShort(m_pfSoundData[i]);
}
memcpy(m_pcSoundData, pshSoundData, m_dwSizeSound);
delete[] pshSoundData;
}
m_WaveBase.Wave_PrepareSaveFile(m_strResAudioFile);
m_WaveBase.Wave_SaveWaveData(m_pcSoundData,m_dwSizeSound);
m_WaveBase.Wave_CloseSaveFile();
}
void CAudioDlg::InitMci()
{
m_cMci.SetCommand("stop");
m_cMci.SetCommand("close");
if(m_bCheckResult)
{
m_cMci.SetFileName(m_strResAudioFile);
}else
{
m_cMci.SetFileName(m_strOriAudioFile);
}
m_cMci.SetAutoEnable(FALSE);
m_cMci.SetNotify(FALSE);
m_cMci.SetWait(FALSE);
m_cMci.SetShareable(FALSE);
m_cMci.SetDeviceType("WaveAudio");
m_cMci.SetCommand("open");
m_cMci.SetTimeFormat(0);
m_cMci.SetPlayEnabled(TRUE);
m_cMci.SetPrevEnabled(TRUE);
m_cMci.SetNextEnabled(TRUE);
}
BEGIN_EVENTSINK_MAP(CAudioDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CAudioDlg)
ON_EVENT(CAudioDlg, IDC_MMCONTROL_AUDIO, 4 /* PlayClick */, OnPlayClickMmcontrolAudio, VTS_PI2)
ON_EVENT(CAudioDlg, IDC_MMCONTROL_AUDIO, 7 /* StopClick */, OnStopClickMmcontrolAudio, VTS_PI2)
ON_EVENT(CAudioDlg, IDC_MMCONTROL_AUDIO, 2 /* PrevClick */, OnPrevClickMmcontrolAudio, VTS_PI2)
ON_EVENT(CAudioDlg, IDC_MMCONTROL_AUDIO, 3 /* NextClick */, OnNextClickMmcontrolAudio, VTS_PI2)
ON_EVENT(CAudioDlg, IDC_MMCONTROL_AUDIO, 23 /* StopGotFocus */, OnStopGotFocusMmcontrolAudio, VTS_NONE)
ON_EVENT(CAudioDlg, IDC_MMCONTROL_AUDIO, 14 /* PlayGotFocus */, OnPlayGotFocusMmcontrolAudio, VTS_NONE)
ON_EVENT(CAudioDlg, IDC_MMCONTROL_AUDIO, 38 /* Done */, OnDoneMmcontrolAudio, VTS_PI2)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CAudioDlg::OnPlayClickMmcontrolAudio(short FAR* Cancel)
{
m_bPlaying = TRUE;
m_cMci.SetPlayEnabled(FALSE);
m_cMci.SetBackEnabled(FALSE);
m_cMci.SetPrevEnabled(FALSE);
m_cMci.SetStepEnabled(FALSE);
m_cMci.SetNextEnabled(FALSE);
m_cMci.SetStopEnabled(TRUE);
m_dwOffSetBak = m_dwOffSet;
m_cMci.SetFrom(ConvertOffsetToTime(m_dwEditOffSet));
SetTimer(MY_TIMER_ARRIVE,MY_TIMER_LENGTH,NULL);
m_cMci.SetCommand("play");
}
void CAudioDlg::OnCheckCycle()
{
UpdateData(TRUE);
}
void CAudioDlg::OnStopClickMmcontrolAudio(short FAR* Cancel)
{
m_bPlaying = FALSE;
m_cMci.SetCommand("stop");
m_cMci.SetPlayEnabled(TRUE);
m_cMci.SetNextEnabled(TRUE);
m_cMci.SetPrevEnabled(TRUE);
m_cMci.SetStopEnabled(FALSE);
m_cMci.SetPauseEnabled(FALSE);
KillTimer(MY_TIMER_ARRIVE);
}
void CAudioDlg::OnPrevClickMmcontrolAudio(short FAR* Cancel)
{
}
void CAudioDlg::OnNextClickMmcontrolAudio(short FAR* Cancel)
{
}
void CAudioDlg::OnStopGotFocusMmcontrolAudio()
{
short shM=0;
OnStopClickMmcontrolAudio(&amt;shM);
}
void CAudioDlg::OnPlayGotFocusMmcontrolAudio()
{
short shM=0;
OnPlayClickMmcontrolAudio(&amt;shM);
}
void CAudioDlg::OnDoneMmcontrolAudio(short FAR* NotifyCode)
{
m_dwOffSet = m_dwOffSetBak;
m_cScrollBar.SetScrollPos(int(m_dwOffSet*1.0*SCROLLLEN*(m_nEditBit/8)/m_dwSizeSound),TRUE);
m_dwEditOffSet = m_dwOffSet;
UpdateData(FALSE);
short shM;
switch(*NotifyCode)
{
case 1:
if(m_bCheckCycle)
{
shM = 0;
OnPlayClickMmcontrolAudio(&amt;shM);
}
else
{
shM=8;
OnStopClickMmcontrolAudio(&amt;shM);
BrushRect();
m_bPlaying = FALSE;
}
break;
}
}
long CAudioDlg::ConvertOffsetToTime(DWORD dwOffSet)
{
long dwM;
dwM = long(dwOffSet*1000.0/m_nSamplesPerSec);
return dwM;
}
void CAudioDlg::DrawWave(CPen *pPenWaveColor)
{
CDC* pDC=GetDC();
CRgn *pRect = NULL;
int x = 0;
int i;
int nEndPoint;
CPen* pOldPen;
pRect = new CRgn;
pRect->CreateRectRgn(0,0,m_nViewWidth,m_nViewHeight);
pDC->SelectClipRgn(pRect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(m_nViewWidth,32767);
pDC->SetViewportExt(m_ClientRect.right,-m_ClientRect.bottom);
pDC->SetViewportOrg(0,m_nViewHeight/2);
nEndPoint = min(m_nViewWidth,int((m_dwSizeSound/(m_nEditBit/8)-m_dwEditOffSet)/m_nEditZoomX));
pOldPen=pDC->SelectObject(&amt;m_PenAxis);
pDC->MoveTo(0,0);
pDC->LineTo(m_nViewWidth,0);
pDC->SelectObject(m_PenWave[1]);
pDC->MoveTo(0,int(m_pfSoundData[0]/m_fEditZoomY));
for(i=0; i<nEndPoint; i++)
{
pDC->LineTo(i, int(m_pfSoundData[i*m_nEditZoomX+m_dwEditOffSet]/m_fEditZoomY));
}
pDC->SelectObject(pPenWaveColor);
pDC->MoveTo(0,int(m_pfRecData[0]/m_fEditZoomY));
for(i=0; i<nEndPoint; i++)
{
pDC->LineTo(i, int(m_pfRecData[i*m_nEditZoomX+m_dwEditOffSet]/m_fEditZoomY));
}
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
delete pRect;
}
void CAudioDlg::OnChangeEditZoomx()
{
UpdateData(TRUE);
BrushRect();
}
void CAudioDlg::OnChangeEditZoomy()
{
UpdateData(TRUE);
BrushRect();
}
void CAudioDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if(m_bPlaying)return;
if(m_pfSoundData==NULL) return;
BOOL bChang = FALSE;
if(&amt;m_cScrollBar == pScrollBar)
{
switch(nSBCode)
{
case SB_LEFT:
m_dwOffSet = 0;
bChang = TRUE;
break;
case SB_RIGHT:
bChang = TRUE;
m_dwOffSet = m_dwSizeSound/(m_nEditBit/8)-1;
break;
case SB_LINELEFT:
if(m_dwOffSet)
{
m_dwOffSet -= LINESIZE;
bChang = TRUE;
}
break;
case SB_LINERIGHT:
if(m_dwOffSet<(m_dwSizeSound/(m_nEditBit/8)))
{
m_dwOffSet +=LINESIZE;
bChang = TRUE;
}
break;
case SB_PAGELEFT:
bChang=TRUE;
if(m_dwOffSet>DWORD(m_nViewWidth)) m_dwOffSet -= m_nViewWidth;
else m_dwOffSet = 0;
break;
case SB_PAGERIGHT:
bChang=TRUE;
if(m_dwOffSet+m_nViewWidth>=(m_dwSizeSound/(m_nEditBit/8)))
m_dwOffSet = m_dwSizeSound/(m_nEditBit/8);
else m_dwOffSet += m_nViewWidth;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
bChang=TRUE;
m_dwOffSet = int(nPos*1.0*m_dwSizeSound/(m_nEditBit/8)/SCROLLLEN);
break;
}
if(bChang)
{
m_cScrollBar.SetScrollPos(int(m_dwOffSet*1.0*SCROLLLEN*(m_nEditBit/8)/m_dwSizeSound),TRUE);
m_dwEditOffSet = m_dwOffSet;
UpdateData(FALSE);
BrushRect();
}
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CAudioDlg::OnChangeEditOffset()
{
UpdateData(TRUE);
if(m_dwEditOffSet>(m_dwSizeSound/(m_nEditBit/8)))
{
AfxMessageBox("数值超过了音频数据上限");
return;
}
m_dwOffSet = m_dwEditOffSet;
CRect *pRect = new CRect;
m_cScrollBar.SetScrollPos(int(m_dwOffSet*1.0*SCROLLLEN*(m_nEditBit/8)/m_dwSizeSound),TRUE);
m_dwEditOffSet = m_dwOffSet;
UpdateData(FALSE);
m_cView.GetWindowRect(pRect);
ScreenToClient(pRect);
InvalidateRect(pRect);
OnPaint();
delete pRect;
}
void CAudioDlg::BrushRect()
{
CRect *pRect = new CRect;
m_cView.GetWindowRect(pRect);
ScreenToClient(pRect);
InvalidateRect(pRect);
OnPaint();
delete pRect;
}
void CAudioDlg::OnTimer(UINT nIDEvent)
{
CRect *pRect = new CRect;
switch(nIDEvent)
{
case MY_TIMER_ARRIVE:
m_dwOffSet=ConvertTimeToOffset(m_cMci.GetPosition());
m_cScrollBar.SetScrollPos(int(m_dwOffSet*1.0*SCROLLLEN*(m_nEditBit/8)/m_dwSizeSound),TRUE);
m_dwEditOffSet = m_dwOffSet;
UpdateData(FALSE);
m_cView.GetWindowRect(pRect);
ScreenToClient(pRect);
InvalidateRect(pRect);
OnPaint();
delete pRect;
break;
case MY_TIMER_SOUND:
m_cView.GetWindowRect(pRect);
ScreenToClient(pRect);
InvalidateRect(pRect);
OnPaint();
delete pRect;
break;
}
CDialog::OnTimer(nIDEvent);
}
DWORD CAudioDlg::ConvertTimeToOffset(long time)
{
DWORD dwM;
dwM = DWORD(time/1000.0*m_nSamplesPerSec);
return dwM;
}
void CAudioDlg::DrawWave8bit(CPen *pPenWaveColor)
{
CDC* pDC=GetDC();
CRgn rect;
rect.CreateRectRgn(0,0,m_nViewWidth,m_nViewHeight);
pDC->SelectClipRgn(&amt;rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetViewportOrg(0,m_nViewHeight/2);
CPen* pOldPen=pDC->SelectObject(&amt;m_PenAxis);
pDC->MoveTo(0,0);
pDC->LineTo(m_nViewWidth,0);
pDC->SelectObject(pPenWaveColor);
pDC->MoveTo(0,int(m_pfSoundData[0]/m_fEditZoomY));
int x = 0;
int i;
int nEndPoint = min(m_nViewWidth,int((m_dwSizeSound/(m_nEditBit/8)-m_dwEditOffSet)/m_nEditZoomX));
for(i=0; i<nEndPoint; i++)
{
pDC->LineTo(i, int(m_pfSoundData[i*m_nEditZoomX+m_dwEditOffSet]/m_fEditZoomY));
}
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
}
void CAudioDlg::OnProcessFft()
{
if(m_pfSoundData==NULL)
{
AfxMessageBox("没有音频数据");
return;
}
int nSamples = 1<<m_nPower;
DWORD dwLenSignal = m_dwSizeSound/(m_nEditBit/8);
int nBlock = (dwLenSignal+nSamples-1)/nSamples;
CWaveProcess *pWaveProcess = new CWaveProcess;
if(m_pdReFFT!=NULL) delete[] m_pdReFFT;
if(m_pdImFFT!=NULL) delete[] m_pdImFFT;
m_pdReFFT = new double[nBlock*nSamples];
m_pdImFFT = new double[nBlock*nSamples];
pWaveProcess->WaveSignalFFT(m_pfSoundData, dwLenSignal, m_nPower, m_pdReFFT, m_pdImFFT);
m_nViewType = VIEW_FFT;
BrushRect();
delete pWaveProcess;
}
void CAudioDlg::DrawWaveFFT_Energy()
{
if(m_pdReFFT==NULL) return;
if(m_pdImFFT==NULL) return;
CDC* pDC=GetDC();
CRgn rect;
rect.CreateRectRgn(0,0,m_nViewWidth,m_nViewHeight);
pDC->SelectClipRgn(&amt;rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(m_nViewWidth,32767);
pDC->SetViewportExt(m_ClientRect.right,-m_ClientRect.bottom);
pDC->SetViewportOrg(0,m_nViewHeight-10);
CPen* pOldPen=pDC->SelectObject(&amt;m_PenAxis);
pDC->MoveTo(0,0);
pDC->LineTo(m_nViewWidth,0);
pDC->MoveTo(0,int(m_pfSoundData[0]/m_fEditZoomY));
int x = 0;
int i;
int nEndPoint = min(m_nViewWidth,int((m_dwSizeSound/(m_nEditBit/8)-m_dwEditOffSet)/m_nEditZoomX));
int nSamples = 1<<m_nPower;
for(i=0; i<nEndPoint; i++)
{
pDC->SelectObject(&amt;m_PenWave[((i+m_dwEditOffSet)/nSamples)>6]);
pDC->LineTo(i, int(sqrt(m_pdReFFT[i+m_dwEditOffSet]*m_pdReFFT[i+m_dwEditOffSet]+m_pdImFFT[i+m_dwEditOffSet]*m_pdImFFT[i+m_dwEditOffSet])/m_fEditZoomY));
}
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
}
void CAudioDlg::DrawWaveDCT()
{
if(m_pfDCT==NULL) return;
CDC* pDC=GetDC();
CRgn rect;
rect.CreateRectRgn(0,0,m_nViewWidth,m_nViewHeight);
pDC->SelectClipRgn(&amt;rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(m_nViewWidth,32767);
pDC->SetViewportExt(m_ClientRect.right,-m_ClientRect.bottom);
pDC->SetViewportOrg(0,m_nViewHeight-10);
CPen* pOldPen=pDC->SelectObject(&amt;m_PenAxis);
pDC->MoveTo(0,0);
pDC->LineTo(m_nViewWidth,0);
pDC->MoveTo(0,int(m_pfSoundData[0]/m_fEditZoomY));
int x = 0;
int i;
int nEndPoint = min(m_nViewWidth,int((m_dwSizeSound/(m_nEditBit/8)-m_dwEditOffSet)/m_nEditZoomX));
int nSamples = 1<<m_nPower;
for(i=0; i<nEndPoint; i++)
{
pDC->SelectObject(&amt;m_PenWave[((i+m_dwEditOffSet)/nSamples)>6]);
pDC->LineTo(i, abs(int(m_pfDCT[i+m_dwEditOffSet]/m_fEditZoomY+0.5)));
}
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
}
void CAudioDlg::OnProcessFftI()
{
if(m_pdReFFT==NULL)
{
AfxMessageBox("没有进行FFT");
return;
}
if(m_pdImFFT==NULL)
{
AfxMessageBox("没有进行FFT");
return;
}
int nSamples = 1<<m_nPower;
DWORD dwLenSignal = m_dwSizeSound/(m_nEditBit/8);
int nBlock = (dwLenSignal+nSamples-1)/nSamples;
CWaveProcess *pWaveProcess = new CWaveProcess;
pWaveProcess->WaveSignalFFT_I(m_pfSoundData, dwLenSignal, m_nPower, m_pdReFFT, m_pdImFFT);
m_nViewType = VIEW_WAVE_16;
m_strResAudioFile = "d:/DCTIV.wav";
SaveAudioWaveFile();
m_cCheckResult.EnableWindow(TRUE);
BrushRect();
InitMci();
delete pWaveProcess;
}
void CAudioDlg::OnOptionChangeFftPower()
{
CDialogFFTPara DialogFFTPara;
DialogFFTPara.m_nEditPower = m_nPower;
if(DialogFFTPara.DoModal()==IDOK)
{
m_nPower = DialogFFTPara.m_nEditPower;
}
}
void CAudioDlg::OnCheckResult()
{
UpdateData(TRUE);
InitMci();
}
void CAudioDlg::OnProcessLowpass()
{
int nStep = 10;
CWaveProcess *pWaveProcess = new CWaveProcess;
memcpy(m_pfSoundData, m_pfRecData, m_dwSizeSound/(m_nEditBit/8)*sizeof(float));
pWaveProcess->LowPass(m_pfSoundData, m_dwSizeSound/(m_nEditBit/8), nStep);
m_strResAudioFile = "d:/LowPass.wav";
SaveAudioWaveFile();
m_cCheckResult.EnableWindow(TRUE);
BrushRect();
InitMci();
delete pWaveProcess;
}
void CAudioDlg::OnPROCESSHighPASS()
{
int nStep = 2;
int nTh = 5;
float fRate = 2.0f;
CWaveProcess *pWaveProcess = new CWaveProcess;
memcpy(m_pfSoundData, m_pfRecData, m_dwSizeSound/(m_nEditBit/8)*sizeof(float));
pWaveProcess->HighPass(m_pfSoundData, m_dwSizeSound/(m_nEditBit/8), nStep, nTh, fRate);
m_strResAudioFile = "d:/HighPass.wav";
SaveAudioWaveFile();
m_cCheckResult.EnableWindow(TRUE);
BrushRect();
InitMci();
delete pWaveProcess;
}
void CAudioDlg::OnProcessDctiv()
{
if(m_pfSoundData==NULL)
{
AfxMessageBox("没有音频数据");
return;
}
int nSamples = 1<<m_nPower;
DWORD dwLenSignal = m_dwSizeSound/(m_nEditBit/8);
int nBlock = (dwLenSignal+nSamples-1)/nSamples;
CWaveProcess *pWaveProcess = new CWaveProcess;
if(m_pfDCT!=NULL) delete[] m_pfDCT;
m_pfDCT = new float[nBlock*nSamples];
pWaveProcess->WaveSignalDCTIV(m_pfSoundData, m_pfDCT, dwLenSignal, m_nPower);
m_nViewType = VIEW_DCT;
BrushRect();
delete pWaveProcess;
}
void CAudioDlg::OnProcessIdctiv()
{
if(m_pfDCT==NULL)
{
AfxMessageBox("没有频率数据");
return;
}
int nSamples = 1<<m_nPower;
DWORD dwLenSignal = m_dwSizeSound/(m_nEditBit/8);
int nBlock = (dwLenSignal+nSamples-1)/nSamples;
CWaveProcess *pWaveProcess = new CWaveProcess;
pWaveProcess->WaveSignalIDCTIV(m_pfSoundData, m_pfDCT, dwLenSignal, m_nPower);
m_nViewType = VIEW_WAVE_16;
m_strResAudioFile = "d:/DCTIV.wav";
SaveAudioWaveFile();
m_cCheckResult.EnableWindow(TRUE);
BrushRect();
InitMci();
delete pWaveProcess;
}
void CAudioDlg::DrawSoundIn(CPen *pPenWaveColor)
{
CDC* pDC=GetDC();
CRgn rect;
int x = 0;
int i;
rect.CreateRectRgn(0,0,m_nViewWidth,m_nViewHeight);
pDC->SelectClipRgn(&amt;rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(m_nViewWidth,32767);
pDC->SetViewportExt(m_ClientRect.right,-m_ClientRect.bottom);
pDC->SetViewportOrg(0,m_nViewHeight/2);
CPen* pOldPen=pDC->SelectObject(&amt;m_PenAxis);
pDC->MoveTo(0,0);
pDC->LineTo(m_nViewWidth,0);
pDC->SelectObject(pPenWaveColor);
pDC->MoveTo(0,int(Sound.InputBuffer[0]-m_shEmendation));
for(i=0; i<m_ClientRect.right; i++)
{
pDC->LineTo(i, int(Sound.InputBuffer[i]-m_shEmendation));
}
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
}
void CAudioDlg::OnSoundIn()
{
if(m_bSoundStart)
{
OnSoundInStop();
}
int nSum = 0;
int nMaxSamples = 1024*3;
m_nEditChannel = 1;
m_nEditPointPerSec = 44000;
m_nEditBit = 16;
m_nSamplesPerSec = m_nEditPointPerSec;
Sound.OpenMic(m_nEditChannel, m_nSamplesPerSec, m_nEditBit, nMaxSamples);
SetTimer(MY_TIMER_ARRIVE,MY_TIMER_LENGTH,NULL);
m_nViewType = VIEW_SOUNDIN;
UpdateData(FALSE);
m_bSoundStart = TRUE;
}
void CAudioDlg::OnSoundInSquare()
{
if(m_bSoundStart)
{
OnSoundInStop();
}
int nSum = 0;
int nMaxSamples = 1024*2;
m_nEditChannel = 1;
m_nEditPointPerSec = 22000;
m_nEditBit = 16;
m_nSamplesPerSec = m_nEditPointPerSec;
Sound.OpenMic(m_nEditChannel, m_nSamplesPerSec, m_nEditBit, nMaxSamples);
SetTimer(MY_TIMER_ARRIVE,MY_TIMER_LENGTH,NULL);
m_nViewType = VIEW_SOUNDIN;
UpdateData(FALSE);
m_bSoundStart = TRUE;
}
void CAudioDlg::OnSoundInStop()
{
Sound.CloseMic();
Sound.CloseOutput();
KillTimer(MY_TIMER_ARRIVE);
m_nViewType = NULL;
}
void CAudioDlg::OnPitchDetector()
{
}
void CAudioDlg::OnPitchDetectorVoice()
{
}
void CAudioDlg::DrawSimulate(float *pfSimulate, CPen *pPenWaveColor)
{
CDC* pDC=GetDC();
CRgn rect;
int x = 0;
int i;
rect.CreateRectRgn(0,0,m_nViewWidth,m_nViewHeight);
pDC->SelectClipRgn(&amt;rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(m_nViewWidth,32767);
pDC->SetViewportExt(m_ClientRect.right,-m_ClientRect.bottom);
pDC->SetViewportOrg(0,m_nViewHeight/2);
int nEndPoint = min(m_nViewWidth,int((m_dwSizeSound/(m_nEditBit/8)-m_dwEditOffSet)/m_nEditZoomX));
CPen* pOldPen=pDC->SelectObject(&amt;m_PenAxis);
pDC->MoveTo(0,0);
pDC->LineTo(m_nViewWidth,0);
pDC->SelectObject(m_PenWave[1]);
pDC->MoveTo(0,int(pfSimulate[0]/m_fEditZoomY));
for(i=0; i<nEndPoint; i++)
{
pDC->LineTo(i, int(pfSimulate[i]/m_fEditZoomY));
}
pDC->SelectObject(pPenWaveColor);
ReleaseDC(pDC);
}
void CAudioDlg::OnSoundEmendation()
{
int i;
int nSum = 0;
short *pshSoundata = new short[Sound.m_NbMaxSamples];
memcpy(pshSoundata, Sound.InputBuffer, Sound.m_NbMaxSamples*sizeof(short));
for(i=0; i<Sound.m_NbMaxSamples; i++)
{
nSum = nSum+(int)pshSoundata[i];
}
m_shEmendation = (short)(nSum/Sound.m_NbMaxSamples)+200;
delete[] pshSoundata;
}