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

📄 lcysinedlg.cpp

📁 声卡示波器程源代码,基于个人电脑的示波器带有触发功能
💻 CPP
字号:
// lcysineDlg.cpp : implementation file
//

#include "stdafx.h"
#include "lcysine.h"
#include "lcysineDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/********************新加的内容开始*****************************/
#include "lcylib.h"
unsigned long CLcysineDlg::m_SAMPLE_RATE=22050;/*默认采样频率*/
float* CLcysineDlg::m_sinaDatePr;/*开辟内存指针*/
unsigned long CLcysineDlg::m_Index=0;/*开辟内存指针的索引*/
/**************************新加的内容结束***********************/
// CLcysineDlg dialog
CLcysineDlg::CLcysineDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CLcysineDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CLcysineDlg)
	m_edit1 = 1000;//新加的内容,设置默认输出频率初值
	m_edit2 = 1;//新加的内容,设置默认定时输出持续时间
	//}}AFX_DATA_INIT
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CLcysineDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CLcysineDlg)
	DDX_Control(pDX, IDC_RADIO1, m_radio22050);
	DDX_Text(pDX, IDC_EDIT1, m_edit1);
	DDX_Text(pDX, IDC_EDIT2, m_edit2);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CLcysineDlg, CDialog)
	//{{AFX_MSG_MAP(CLcysineDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
	ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
	ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
	ON_BN_CLICKED(IDC_RADIO4, OnRadio4)
	ON_BN_CLICKED(IDC_RADIO5, OnRadio5)
	ON_BN_CLICKED(IDC_RADIO6, OnRadio6)
	ON_BN_CLICKED(IDC_RADIO7, OnRadio7)
	ON_BN_CLICKED(IDC_RADIO8, OnRadio8)
	ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
	ON_EN_CHANGE(IDC_EDIT2, OnChangeEdit2)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
	ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
	ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
	ON_WM_CLOSE()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLcysineDlg message handlers

BOOL CLcysineDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	SetIcon(m_hIcon, TRUE);			
	SetIcon(m_hIcon, FALSE);		
	m_radio22050.SetCheck(1);//新加的内容,使“22050”按钮为默认。
	Pa_Initialize();//新加的内容,调函数库初始化函数*/
	m_SetTimerNums=0;/*设置定时器标记:1已设置;0已取消*/
	m_OpenNums=0;/*打开声卡标记:1已打开;0已关闭*/
	m_time=1000;/*默认定时输出持续时间1000毫秒*/
	m_lcy_f=1000;/*默认输出频率*/
	return TRUE; 
}

void CLcysineDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

HCURSOR CLcysineDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
/********************新加的内容开始*****************************/
/*“22050”设置采样频率按钮函数*/
void CLcysineDlg::OnRadio1() 
{
	m_SAMPLE_RATE=22050;
	OnButton3();
}
/*“11025”设置采样频率按钮函数*/
void CLcysineDlg::OnRadio2() 
{
	m_SAMPLE_RATE=11025;
	OnButton3();
}
/*“8000”设置采样频率按钮函数*/
void CLcysineDlg::OnRadio3() 
{
	m_SAMPLE_RATE=8000;
	OnButton3();
}
/*“44100”设置采样频率按钮函数*/
void CLcysineDlg::OnRadio4() 
{
	m_SAMPLE_RATE=44100;
	OnButton3();
}
/*“48000”设置采样频率按钮函数*/
void CLcysineDlg::OnRadio5() 
{
	m_SAMPLE_RATE=48000;
	OnButton3();
}
/*“64000”设置采样频率按钮函数*/
void CLcysineDlg::OnRadio6() 
{
	m_SAMPLE_RATE=64000;
	OnButton3();
}
/*“82000”设置采样频率按钮函数*/
void CLcysineDlg::OnRadio7() 
{
	m_SAMPLE_RATE=88200;
	OnButton3();
}
/*“96000”设置采样频率按钮函数*/
void CLcysineDlg::OnRadio8() 
{
	m_SAMPLE_RATE=96000;
	OnButton3();
}
/*编辑框1内容设置频率改变响应函数*/
void CLcysineDlg::OnChangeEdit1() 
{
	UpdateData(1);
    m_lcy_f=m_edit1;
	OnButton3();
}
/*编辑框2内容设置定时时间改变响应函数*/
void CLcysineDlg::OnChangeEdit2() 
{
	UpdateData(1);
    m_time=m_edit2*1000;
	OnButton3();
	
}
/*连续输出“开始输出”按钮函数*/
void CLcysineDlg::OnButton1() 
{
	if(m_OpenNums!=0){
		lcy_CloseSoundCard();
			m_OpenNums=0;
	}
	if(m_SetTimerNums!=0){
		KillTimer(1);
		m_SetTimerNums=0;
	}
	lcy_OpenSoundCard();	
}
/*定时输出“开始输出”按钮函数*/
void CLcysineDlg::OnButton2() 
{
	if(m_OpenNums!=0){
		lcy_CloseSoundCard();
			m_OpenNums=0;
	}
	if(	m_SetTimerNums==0){
		SetTimer(1,m_time,NULL);
		m_SetTimerNums=1;
	}
	lcy_OpenSoundCard();	
}
/*“停止输出”按钮函数*/
void CLcysineDlg::OnButton3() 
{
	if(m_OpenNums!=0){
		lcy_CloseSoundCard();
			m_OpenNums=0;
	}
	if(m_SetTimerNums!=0){
		KillTimer(1);
		m_SetTimerNums=0;
	}	
}
/*“退出程序”按钮函数*/
void CLcysineDlg::OnButton4() 
{
	if(m_OpenNums!=0)
		lcy_CloseSoundCard();
	CDialog::OnCancel();
}
/*退出程序响应函数*/
void CLcysineDlg::OnClose() 
{
	if(m_OpenNums!=0)
		lcy_CloseSoundCard();
	CDialog::OnClose();
}
/*定时器响应函数*/
void CLcysineDlg::OnTimer(UINT nIDEvent) 
{
	KillTimer(1);
	m_SetTimerNums=0;
	if(m_OpenNums!=0){
		lcy_CloseSoundCard();
			m_OpenNums=0;
	}	
	CDialog::OnTimer(nIDEvent);
}
/* 回调函数*/
int CLcysineDlg::lcy_Callback(void *inputBuffer, void *outputBuffer,
                          unsigned long framesPerBuffer,
                          double outTime, void *userData )
{
  float *out = (float*)outputBuffer;
  unsigned long i;
  for( i=0; i<framesPerBuffer; i++ ){
	   *out++=m_sinaDatePr[m_Index]; 
	   m_Index++;
	   if(m_Index>=m_SAMPLE_RATE )
		   m_Index-=m_SAMPLE_RATE;
  }
  return 0;
}

/*生成正弦波信号数据、输出正弦波信号函数*/
void CLcysineDlg::lcy_OpenSoundCard()
{
  int err;
  unsigned long i;  
  double lcy_w;
  m_sinaDatePr=new float[m_SAMPLE_RATE];/*开辟内存空间*/
  lcy_w=2.0*M_PI*m_lcy_f/m_SAMPLE_RATE;
  /*生成正弦波信号数据*/
  for(i=0;i<m_SAMPLE_RATE;i++ ){//生成正弦波信号数据
	  m_sinaDatePr[i]=(float)sin((double)i*lcy_w);
  }
  m_Index=0;
  /*调打开数据流函数*/
  err=Pa_OpenStream(
      &stream,    /*数据流指针*/
      paNoDevice, /*关闭输入端*/
      0,          /*输入端数为0*/
      paFloat32,  /*输入数据为32位浮点数据*/
      NULL,       /*不另调输入驱动程序*/
      Pa_GetDefaultOutputDeviceID(), /*获得默认的输出端地址*/
      1,          /*单声道输出方式*/
      paFloat32,  /*输出数据为32位浮点数据*/
      NULL,       /*不另调输出驱动程序*/
      m_SAMPLE_RATE,/*采样频率*/
      1,       /*framesPerBuffer每个缓冲区大小*/
      0,          /*缓冲区数,为0时用默认最小值*/
      paClipOff,  /*关闭音效*/
      lcy_Callback, /*回调参数*/
      NULL       /*用户数据*/
 );
  if(err!=paNoError) goto error;
  /*调开始输出数据流函数*/
  err=Pa_StartStream(stream);
  if(err!=paNoError) goto error;
  m_OpenNums=1;
  return;
error:
  lcy_CloseSoundCard();
}
/*关闭声卡函数*/
void CLcysineDlg::lcy_CloseSoundCard()
{
  /*调关闭数据流函数*/
  Pa_CloseStream(stream);
  /*调退出程序函数*/
  Pa_Terminate();
  /*释放开辟的内存空间*/
  if(m_sinaDatePr!=NULL)
	  delete []m_sinaDatePr;
}
/**************************新加的内容结束***********************/

⌨️ 快捷键说明

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