?? lcysinedlg.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 + -