基于聲卡的頻率計專業(yè)課程設(shè)計報告_第1頁
基于聲卡的頻率計專業(yè)課程設(shè)計報告_第2頁
基于聲卡的頻率計專業(yè)課程設(shè)計報告_第3頁
基于聲卡的頻率計專業(yè)課程設(shè)計報告_第4頁
基于聲卡的頻率計專業(yè)課程設(shè)計報告_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 大 連 民 族 學(xué) 院 專 業(yè) 綜 合 課 程 設(shè) 計 題目: 頻 率 計 班級: 姓名: 同組名 指導(dǎo)教師: 設(shè)計日期: 目錄引言 . .3  設(shè)計意義.3一 設(shè)計要求.3二 設(shè)計方案.4 2.1 聲卡的采樣.4 2.2 對采樣的信號進行頻率值計算.4 2.3 程序編寫模塊.5三 軟件設(shè)計.6 3.1 音頻錄制.6 3.2 數(shù)據(jù)抽樣.7 3.3 FFT分析與計算.7 3.4 顯示./.8四 系統(tǒng)調(diào)試.9五 總結(jié).9六 附錄.10七 參考文獻.23 用聲卡實現(xiàn)的頻率計設(shè)計 引言 設(shè)計意義: 聲卡,也叫音頻卡,是MPC的必要部件,它是計算機進行聲音處理的適配器。它

2、有三個基本功能:一是音樂合成發(fā)音功能;二是混音器(Mixer)功能和數(shù)字聲音效果處理器(DSP)功能;三是模擬聲音信號的輸入和輸出功能。聲卡處理的聲音信息在計算機中以文件的形式存儲。聲卡工作應(yīng)有相應(yīng)的軟件支持,包括驅(qū)動程序、混頻程序(mixer)和CD播放程序等。多媒體電腦中用來處理聲音的接口卡。聲卡可以把來自話筒、收錄音機、激光唱機等設(shè)備的語音、音樂等聲音變成數(shù)字信號交給電腦處理,并以文件形式存盤,還可以把數(shù)字信號還原成為真實的聲音輸出。聲卡尾部的接口從機箱后側(cè)伸出,上面有連接麥克風(fēng)、音箱、游戲桿和MIDI設(shè)備的接口。我們常用的PC機中的聲卡不僅能輸出個錄制各種音頻信號,利用其內(nèi)部的A/D(

3、模擬/數(shù)字)轉(zhuǎn)換器,通過編寫程序還可以對外部的音頻信號進行采樣處理,觀察采樣波形,并計算出采樣周期,采樣平率的最大值等所需的各種數(shù)據(jù)都可以通過聲卡得到。一 設(shè)計內(nèi)容及要求: 基于C+設(shè)計一個頻率計,利用PC機中的聲卡實現(xiàn)對音頻的采集,頻譜分析,最終計算出原始聲音的頻率等功能。二 設(shè)計方案: 該程序是在VS2010環(huán)境中用C+語言編寫的,共三大模塊:一是聲卡采樣模塊:二是對采樣的信號進行頻率值的計算;三是程序編寫模塊。 2.1 聲卡的采樣:聲卡是PC的一種多媒體設(shè)備,所以可以用Windows 的MCI(Media Control I nterface)命令來控制聲卡。MCI它提供了一組與設(shè)備無關(guān)

4、的控制命令,是一種訪問多媒體設(shè)備的高層次方法。也正因為它屬于一種高層次方法,所以它提供給程序員的靈活性有限,利用MCI命令來控制聲卡錄音時,程序員不能在錄音的過程中訪問內(nèi)存中的采樣數(shù)據(jù),只有在錄音完成后通過訪問*.WAV文件才可以得到采樣數(shù)據(jù),盡管最終還是得到了采樣數(shù)據(jù),但是這樣做一方面嫌其麻煩,更重要的是存取文件需要耗費時間,聲卡在采樣的過程中有可能會停止下來等待文件操作,造成了采樣的斷續(xù)。在一個標(biāo)準(zhǔn)的通過波形聲音輸入設(shè)備記錄聲音的程序中,函數(shù)應(yīng)該按照以下順序調(diào)用:獲取波形聲音輸入設(shè)備,設(shè)置波形聲音格式;waveInOpen,打開波形聲音輸入設(shè)備;waveInPrepareHeader,為波

5、形聲音輸入設(shè)備準(zhǔn)備一個緩沖區(qū);waveInAddBuffer 向波形聲音輸入設(shè)備添加緩沖區(qū);waveInStart 開始錄音。在使用waveInOpen這個函數(shù)之前,應(yīng)該設(shè)置一個類型為HWAVEIN的變量,傳遞給該函數(shù)來記錄輸入設(shè)備的句柄,并在之后的函數(shù)中使用,同時應(yīng)通過uDeviceID和pwfx指定設(shè)備和聲音格式,其中WINAPI中給予聲音格式。 2.2 對采樣的信號進行頻率值的計算:標(biāo)準(zhǔn)的數(shù)字頻率計測量信號的頻率值時,為了提高測量精度,一般采用兩種方法:當(dāng)被測信號的頻率遠高于基準(zhǔn)頻率時,采用頻率記數(shù)法,即基準(zhǔn)頻率信號作為閘門信號,在該閘門信號的時間間隔內(nèi),對被測信號的脈沖進行記數(shù),用公式

6、:被測信號的頻率=被測信號的脈沖數(shù)÷閘門信號的時間間隔,計算出信號的頻率值;當(dāng)被測信號的頻率遠低于基準(zhǔn)頻率時,采用周期記數(shù)法,即被測信號作為閘門信號,在該閘門信號的時間間隔內(nèi),對基準(zhǔn)信號的脈沖進行記數(shù),用公式:被測信號的周期=基準(zhǔn)信號的脈沖數(shù)×基準(zhǔn)信號的周期,計算出信號的周期,再求其倒數(shù),就可計算出頻率。該程序計算頻率值時,也采用兩種方法,不同的是,一種是快速復(fù)數(shù)傅立葉變換FFTC法即對采得的信號數(shù)據(jù)進行快速復(fù)數(shù)傅立葉變換,把時間域的信號轉(zhuǎn)換為頻率域的信號,在頻率域中找出最大值,就是該信號基波的頻率值,另一種是采樣脈沖記數(shù)法,即在時域內(nèi)檢測出被測信號在采樣長度內(nèi)的周期數(shù)M(

7、M 取整數(shù)),和該周期數(shù)內(nèi)的采樣脈沖數(shù)N􀇞采樣長度就是對信號采樣的點數(shù),用公式:被測信號的頻率=聲卡采樣頻率×M÷N􀇞計算出信號的頻率值??焖購?fù)數(shù)傅立葉變換FFTC法的優(yōu)點是,不僅能對常見的標(biāo)準(zhǔn)的周期性波形,如:正弦波、方波、三角波等信號基波的頻率進行測量,而且還能計算出各種復(fù)雜波形的和信噪比非常低的信號基波的頻率值;如:淹沒于噪聲中的信號,缺點是:分辨率受公式分辨率=采樣頻率(Hz)÷采樣長度的限制,如:當(dāng)采樣頻率=采樣長度時,分辨率是1Hz最小測量誤差是=1Hz÷被測信號的頻率,可見,被測信號的頻率值越低,該方法的

8、測量誤差越大。采樣脈沖記數(shù)法的優(yōu)點是:測量低頻信號時精度較高,缺點是:不適合波形復(fù)雜和信噪比低的信號頻率的測量。所以,為了提高測量的可靠性和精度,在被測信號頻率高時,或波形復(fù)雜時,或信噪比低時,采用快速復(fù)數(shù)傅立葉變換(FFTC)法:否則,采用采樣脈沖記數(shù)法。在測量的過程中,程序先判斷信號上述的性質(zhì),根據(jù)信號的性質(zhì),自動地采用相應(yīng)的測量方法。2.3 程序編寫模塊: 在一些實時性要求比較高的場合(比如波形分析,實時控制等),斷續(xù)的采樣明顯是不行的。 Windows的低級波形音頻函數(shù)提供了對聲卡的最大靈活性的操作,它允許在采樣過程中隨機地訪問內(nèi)存中的每個采樣數(shù)據(jù),完全可以克服使用MCI命令所遇到的實

9、時性問題。 Windows以動態(tài)連接庫Mmsystem.dll的形式提供低級波形音頻函數(shù),在Mmsystem.dll中總共包括了以下幾個有關(guān)波形錄入的函數(shù)waveInAddBuffer :向聲音輸入設(shè)備發(fā)送緩沖區(qū) ;waveInClose :關(guān)閉聲音輸入設(shè)備 waveInGetDevCaps:獲取聲音輸入設(shè)備性能; waveInGetErrorText:獲取聲音出錯信息文本 waveInGetID :獲取聲音輸入設(shè)備ID; waveInGetNumDevs:返回聲音輸入設(shè)備數(shù)量 waveInGetPosition :獲取聲音設(shè)備輸入位置; waveInMessage :向聲音輸入設(shè)備發(fā)送信息

10、waveInOpen :打開聲音輸入設(shè)備; waveInPrepareHeader:預(yù)備聲音輸入緩沖區(qū) waveInReset :停止聲音輸入設(shè)備工作; waveInStart :停止聲音輸入設(shè)備工作 waveInStop :停止聲音輸入; waveInUnprepareHeader : 清除預(yù)備的聲音文件頭 在C+中對聲卡錄音編程中,MCI按打開設(shè)備、配置設(shè)備、實現(xiàn)功能(或曰發(fā)送命令)、撤銷配置、關(guān)閉設(shè)備的標(biāo)準(zhǔn)次序組織APIs。對于錄音編程而言,其要點在于根據(jù)音頻格式打開對應(yīng)的設(shè)備、配置錄音所需的參數(shù)(主要是設(shè)置數(shù)據(jù)區(qū)以及根據(jù)數(shù)據(jù)接收方式設(shè)置回調(diào)函數(shù)或消息)、按一定次序發(fā)送命令給設(shè)備、接收數(shù)

11、據(jù)并配置參數(shù)以繼續(xù)錄音、停止錄音釋放資源、關(guān)閉設(shè)備等幾個步驟上。所需的函數(shù)說明于mmsystem.h,引入庫是winmm.lib。三 軟件設(shè)計: 該軟件設(shè)計公分四個部分:分別是音頻錄制部分,音頻段落抽樣部分,F(xiàn)FT分析與計算部分,頻率圖形顯示部分。該軟件是基于Visual Studio 2010環(huán)境下用C+語言程序來實現(xiàn)各個模塊的功能。Visual Studio是微軟公司推出的開發(fā)環(huán)境。是目前最流行的Windows平臺應(yīng)用程序開發(fā)環(huán)境。該軟件支持開發(fā)面向Windows 7的應(yīng)用程序,因此此次設(shè)計的軟件應(yīng)用了waveInOpen,在音頻處理中也會用到waveInPrepareHeader、wav

12、eInAddBuffer、waveInStart、waveInReset及waveInClose等函數(shù)。數(shù)據(jù)流程如下圖: 音頻錄制 頻率圖形顯示 數(shù)據(jù)抽樣 頻譜分析3.1 音頻錄制部分: 如圖1該部分由4個按鍵組成,按“rec”鍵開始錄音,“stop”鍵錄音停止,“play”鍵播放音頻并且在顯示框上顯示所錄制的音頻的頻率圖形,“pstop”鍵清0(所有程序停止)。 圖1 3.2 數(shù)據(jù)抽樣部分: 如圖2中2個輸入框“起點”、“終點”分別表示在錄取的音頻信號中抽取的的開始時間和和終止時間,時間間隔加入計時器程序,點擊按鍵“顯示”會在顯示框中顯示出該段的頻率。 圖23.3 FFT分析與計算部分: 如

13、圖3該部分,點擊“FFT”的時候就出現(xiàn)頻譜圖,左邊的顯示框顯示頻率值。 圖33.4 顯示部分: 如圖4該圖所顯示的是3種情況下的頻率。 圖4四 系統(tǒng)調(diào)試: 編譯完程序代碼后,運行調(diào)試生產(chǎn)沒有錯誤后打開生產(chǎn)的文件“0907.exe”,點擊開始“Rec”開始錄音,計數(shù)器計時5s,然后點擊“play”播放并且顯示波形圖形,然后選取間隔100500,經(jīng)過放大并顯示出來,再點擊“FFT”計算出所求的頻率值,系統(tǒng)調(diào)試后的圖形如圖5。 圖5五 總結(jié):通過這次的專業(yè)課程設(shè)計讓我們學(xué)到很多,首先要感謝老師的悉心教導(dǎo),老師給予我們信心和動力做出這個程序,讓我們非計算機專業(yè)的學(xué)生也能編出一個程序來,給予我們?yōu)橐院缶?/p>

14、業(yè)增長了很多經(jīng)驗。同時更要感謝同學(xué)的不斷努力,客服層層困難,最后做出來了。我們學(xué)到了很多的知識。我們要在windows下自帶的錄音機中采集一段語音信號,雖然看起來簡單,但是要弄清C+語言的各種函數(shù),方法,語言結(jié)構(gòu)還是需要花費很多的時間來攻克并且積累經(jīng)驗。通過這次課程設(shè)計,我才明白學(xué)習(xí)是一個長期積累的過程,在以后的工作、生活中都應(yīng)該不斷的學(xué)習(xí),努力提高自己知識和綜合素質(zhì)。特別是對于我,基礎(chǔ)比較差,一定不能太過于心急,要靜下心來慢慢的學(xué)習(xí)。在這次課程設(shè)計中也使我們的同學(xué)關(guān)系更進一步了,同學(xué)之間互相幫助,有什么不懂的大家在一起商量,聽聽不同的看法有助于更好的理解知識,所以在這里感謝幫助我的同學(xué)。以前

15、對C語言也是僅局限在課程中的簡單了解,但是通過此次的課程設(shè)計,讓我了解了解到C+語言的功能的強大以及在Visual C+下進行可視化編程,同時讓我對windows下編程有了進一步的了解。雖然這個設(shè)計做得不算很成功,但是在設(shè)計過程中所學(xué)到的東西使我終身受益。六 附錄:程序代碼:/ /0907Dlg.cpp : 實現(xiàn)文件#include "stdafx.h"#include "0907.h"#include "0907Dlg.h"#include "afxdialogex.h"#include "m

16、ath.h"#ifdef _DEBUG#define new DEBUG_NEW#endif/ 用于應(yīng)用程序“關(guān)于”菜單項的 CAboutDlg 對話框class CAboutDlg : public CDialogExpublic:CAboutDlg();/ 對話框數(shù)據(jù)enum IDD = IDD_ABOUTBOX ; protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持/ 實現(xiàn)protected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CD

17、ialogEx(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()/ CMy0907Dlg 對話框CMy0907Dlg:CMy0907Dlg(CWnd* pParent /*=NULL*/): CDialogEx(CMy0907Dlg:IDD, pParent), m_Xstart(0), m_Yend(0),m_Start(0),m_End(0),

18、i(0), m_dtemp(0)m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);void CMy0907Dlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);DDX_Text(pDX, IDC_X_EDIT, m_Xstart);DDX_Text(pDX, IDC_Y_EDIT, m_Yend);DDX_Text(pDX, IDC_dTemp_EDIT, m_dtemp);BEGIN_MESSAGE_MAP(CMy0907Dlg, CDialogEx)ON_WM

19、_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_MESSAGE(MM_WIM_OPEN,OnMM_WIM_OPEN) /自定義消息映射宏ON_MESSAGE(MM_WIM_DATA,OnMM_WIM_DATA)ON_MESSAGE(MM_WIM_CLOSE,OnMM_WIM_CLOSE)ON_MESSAGE(MM_WOM_OPEN,OnMM_WOM_OPEN)ON_MESSAGE(MM_WOM_DONE,OnMM_WOM_DONE)ON_MESSAGE(MM_WOM_CLOSE,OnMM_WOM_CLOSE) ON_WM_TIMER()ON_

20、BN_CLICKED(IDC_REC_START, &CMy0907Dlg:OnBnClickedRecStart)ON_BN_CLICKED(IDC_REC_STOP, &CMy0907Dlg:OnBnClickedRecStop)ON_BN_CLICKED(IDC_PLAY_START, &CMy0907Dlg:OnBnClickedPlayStart)ON_BN_CLICKED(IDC_PLAY_STOP, &CMy0907Dlg:OnBnClickedPlayStop)ON_BN_CLICKED(IDC_XIANSHI_BUTTON, &CMy0

21、907Dlg:OnBnClickedXianshiButton)ON_BN_CLICKED(IDC_FFT, &CMy0907Dlg:OnBnClickedFft)ON_BN_CLICKED(IDC_TU_STATIC, &CMy0907Dlg:OnBnClickedTuStatic)END_MESSAGE_MAP()/ CMy0907Dlg 消息處理程序BOOL CMy0907Dlg:OnInitDialog()CDialogEx:OnInitDialog();/ 將“關(guān)于.”菜單項添加到系統(tǒng)菜單中。/ IDM_ABOUTBOX 必須在系統(tǒng)命令范圍內(nèi)。ASSERT(IDM_A

22、BOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()pSysMenu->AppendMenu(MF_SEPARATO

23、R);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ 設(shè)置此對話框的圖標(biāo)。當(dāng)應(yīng)用程序主窗口不是對話框時,框架將自動/ 執(zhí)行此操作SetIcon(m_hIcon, TRUE);/ 設(shè)置大圖標(biāo)SetIcon(m_hIcon, FALSE);/ 設(shè)置小圖標(biāo)/ TODO: 在此添加額外的初始化代碼pWaveHdr1=reinterpret_cast<PWAVEHDR>(malloc(sizeof(WAVEHDR); /數(shù)據(jù)緩存的結(jié)構(gòu)體指針pWaveHdr2=reinterpret_cast<PWAVEH

24、DR>(malloc(sizeof(WAVEHDR);/allocate memory for save bufferpSaveBuffer = reinterpret_cast<PBYTE>(malloc(1);return TRUE; / 除非將焦點設(shè)置到控件,否則返回 TRUEvoid CMy0907Dlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialogEx:OnSysCo

25、mmand(nID, lParam);/ 如果向?qū)υ捒蛱砑幼钚』粹o,則需要下面的代碼/ 來繪制該圖標(biāo)。對于使用文檔/視圖模型的 MFC 應(yīng)用程序,/ 這將由框架自動完成。void CMy0907Dlg:OnPaint()if (IsIconic()CPaintDC dc(this); / 用于繪制的設(shè)備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc(), 0);/ 使圖標(biāo)在工作區(qū)矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyI

26、con = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ 繪制圖標(biāo)dc.DrawIcon(x, y, m_hIcon);elseCDialogEx:OnPaint();/當(dāng)用戶拖動最小化窗口時系統(tǒng)調(diào)用此函數(shù)取得光標(biāo)/顯示。HCURSOR CMy0907Dlg:OnQueryDragIcon()return static_cast<HCURSOR

27、>(m_hIcon);void CMy0907Dlg:OnBnClickedRecStart()/ TODO: 在此添加控件通知處理程序代碼pBuffer1=(PBYTE)malloc(INP_BUFFER_SIZE);pBuffer2=(PBYTE)malloc(INP_BUFFER_SIZE);if (!pBuffer1 | !pBuffer2) if (pBuffer1) free(pBuffer1);if (pBuffer2) free(pBuffer2);MessageBeep(MB_ICONEXCLAMATION); /播放由SystemExclamation定義的聲音Afx

28、MessageBox("Memory erro!");return ;/open waveform audo for inputwaveform.wFormatTag=WAVE_FORMAT_PCM; /設(shè)置波形的格式 PCM格式waveform.nChannels=1; /設(shè)置音頻文件的通道數(shù)量waveform.nSamplesPerSec=11025; /設(shè)置每個聲道播放和記錄時的樣本頻率waveform.nAvgBytesPerSec=11025; /設(shè)置請求的平均數(shù)據(jù)傳輸率waveform.nBlockAlign=1; /以字節(jié)為單位設(shè)置塊對齊waveform.wB

29、itsPerSample=8; /根據(jù)wFormatTag的類型設(shè)置每個樣本的位深 如果wFormatTag= WAVE_FORMAT_PCM,此值應(yīng)該設(shè)為8或16waveform.cbSize=0; /額外信息的大小,以字節(jié)為單位if (waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW) /waveInOpen是動態(tài)連接庫winmm.dll之函數(shù),用以開啟波形輸入設(shè)備free(pBuffer1);free(pBuffer2);MessageBeep(MB_

30、ICONEXCLAMATION);AfxMessageBox("Audio can not be open!");pWaveHdr1->lpData=(LPTSTR)pBuffer1; /指向波形數(shù)據(jù)緩沖區(qū)pWaveHdr1->dwBufferLength=INP_BUFFER_SIZE; /波形數(shù)據(jù)緩沖區(qū)的長度pWaveHdr1->dwBytesRecorded=0; /若首部用于輸入, 指出緩沖區(qū)中的數(shù)據(jù)量pWaveHdr1->dwUser=0; /指定用戶的32位數(shù)據(jù)pWaveHdr1->dwFlags=0; /緩沖區(qū)標(biāo)志pWaveHdr

31、1->dwLoops=1; /循環(huán)播放次數(shù), 僅用于輸出緩沖區(qū)pWaveHdr1->lpNext=NULL; /保留pWaveHdr1->reserved=0; /保留waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR); /為波形輸入準(zhǔn)備一個緩沖區(qū)pWaveHdr2->lpData=(LPTSTR)pBuffer2;pWaveHdr2->dwBufferLength=INP_BUFFER_SIZE;pWaveHdr2->dwBytesRecorded=0;pWaveHdr2->dwUser=0;p

32、WaveHdr2->dwFlags=0;pWaveHdr2->dwLoops=1;pWaveHdr2->lpNext=NULL;pWaveHdr2->reserved=0;waveInPrepareHeader(hWaveIn,pWaveHdr2,sizeof(WAVEHDR);/pSaveBuffer = (PBYTE)realloc (pSaveBuffer, 1) ; /改變pSaveBuff內(nèi)存所指大小 為 1/ Add the bufferswaveInAddBuffer (hWaveIn, pWaveHdr1, sizeof (WAVEHDR) ; /向波形

33、輸入設(shè)備發(fā)送一個輸入緩沖區(qū)waveInAddBuffer (hWaveIn, pWaveHdr2, sizeof (WAVEHDR) ;bRecording = TRUE ;bEnding = FALSE ;dwDataLength = 0 ;waveInStart (hWaveIn) ; /啟動輸入 的waveInStart功能開始在給定的波形音頻輸入設(shè)備的輸入。void CMy0907Dlg:OnBnClickedPlayStart()/ TODO: 在此添加控件通知處理程序代碼if (bPlaying) waveOutReset(hWaveOut);/open waveform audi

34、o for outputwaveform.wFormatTag=WAVE_FORMAT_PCM;waveform.nChannels=1;waveform.nSamplesPerSec=11025;waveform.nAvgBytesPerSec=11025;waveform.nBlockAlign=1;waveform.wBitsPerSample=8;waveform.cbSize=0;if (waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW) Me

35、ssageBeep(MB_ICONEXCLAMATION);AfxMessageBox("Audio output erro"); CMy0907Dlg *pWnd = (CMy0907Dlg*)GetDlgItem(IDC_TU_STATIC); CDC* pDC = pWnd->GetDC();int ival;ival = dwDataLength/700;for(j=0;j<=700;j+) pDC->LineTo(j,(*(pSaveBuffer+ival*j); for(i=0;i<=14;i+) pDC->MoveTo(50*i,

36、*pSaveBuffer); pDC->LineTo(50*i,*pSaveBuffer/3); pDC->LineTo(50*i,*pSaveBuffer*2); ReleaseDC(pDC); void CMy0907Dlg:OnBnClickedRecStop()/ TODO: 在此添加控件通知處理程序代碼TRACE("rec stop n");bEnding=TRUE;/Sleep(1500);waveInReset(hWaveIn);LRESULT CMy0907Dlg:OnMM_WIM_OPEN(UINT wParam, LONG lParam) /

37、成功打開錄音設(shè)備返回消息/ TODO: Add your message handler code here and/or call default(CWnd *)(this->GetDlgItem(IDC_REC_START)->EnableWindow(FALSE);(CWnd *)(this->GetDlgItem(IDC_REC_STOP)->EnableWindow(TRUE);(CWnd *)(this->GetDlgItem(IDC_PLAY_START)->EnableWindow(FALSE);(CWnd *)(this->GetDl

38、gItem(IDC_PLAY_STOP)->EnableWindow(FALSE);SetTimer(1,100,NULL);bRecording=TRUE;return 0;/TRACE("MM_WIM_OPENn");LRESULT CMy0907Dlg:OnMM_WIM_DATA(UINT wParam, LONG lParam) /錄音廣播消息,通知獲取音頻數(shù)據(jù)/ TODO: Add your message handler code here and/or call default/ Reallocate save buffer memory/pNewBuf

39、fer = (PBYTE)realloc (pSaveBuffer, dwDataLength + /改變pSaveBuffer 的大小為 后面的數(shù)(PWAVEHDR) lParam)->dwBytesRecorded) ;if (pNewBuffer = NULL)waveInClose (hWaveIn) ;MessageBeep (MB_ICONEXCLAMATION) ;AfxMessageBox("erro memory");return 0;pSaveBuffer = pNewBuffer;/CopyMemory (pSaveBuffer + dwData

40、Length, (PWAVEHDR) lParam)->lpData,(PWAVEHDR) lParam)->dwBytesRecorded) ;/ / dwDataLength += (PWAVEHDR) lParam)->dwBytesRecorded ;if (bEnding) waveInClose (hWaveIn) ;return 0;/ Send out a new bufferwaveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR) ;TRACE("done input datan&q

41、uot;);return 0;LRESULT CMy0907Dlg:OnMM_WIM_CLOSE(UINT wParam, LONG lParam) /成功關(guān)閉錄音設(shè)備返回消息/ TODO: Add your message handler code here and/or call defaultKillTimer(1);TRACE("MM_WIM_CLOSEn");if (0=dwDataLength) return 0;waveInUnprepareHeader (hWaveIn, pWaveHdr1, sizeof (WAVEHDR) ; /清除由 waveInPr

42、epareHeader 完成的準(zhǔn)備waveInUnprepareHeader (hWaveIn, pWaveHdr2, sizeof (WAVEHDR) ;free (pBuffer1) ;free (pBuffer2) ;if (dwDataLength > 0)/enable play(CWnd *)(this->GetDlgItem(IDC_REC_START)->EnableWindow(TRUE);(CWnd *)(this->GetDlgItem(IDC_REC_STOP)->EnableWindow(FALSE);(CWnd *)(this->

43、GetDlgItem(IDC_PLAY_START)->EnableWindow(TRUE);(CWnd *)(this->GetDlgItem(IDC_PLAY_STOP)->EnableWindow(TRUE);bRecording = FALSE ;(CWnd *)(this->GetDlgItem(IDC_REC_START)->EnableWindow(TRUE);(CWnd *)(this->GetDlgItem(IDC_REC_STOP)->EnableWindow(FALSE);return 0;void CMy0907Dlg:OnDe

44、stroy() CDialog:OnDestroy();/ TODO: Add your message handler code hereCDialog:OnClose();if (bRecording) bTerminating=TRUE;bEnding=TRUE;waveInReset(hWaveIn);TRACE("waveInResetn");Sleep(500);/return CWinThread:ExitInstance();if (bPlaying) bTerminating=TRUE;bEnding=TRUE;waveOutReset(hWaveOut)

45、;Sleep(500);free (pWaveHdr1) ;free (pWaveHdr2) ;free (pSaveBuffer) ;void CMy0907Dlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultCDialog:OnTimer(nIDEvent);MMTIME mmTime; /MMTIME結(jié)構(gòu)包含不同類型的多媒體數(shù)據(jù)的定時信息mmTime.wType=TIME_MS;TCHAR time20;switch(nIDEvent) case 1:waveIn

46、GetPosition(hWaveIn,&mmTime,sizeof(MMTIME);itoa(mmTime.u.ms/10000,time,10);(CWnd *)GetDlgItem(IDC_STATIC)->SetWindowText(time); /SetWindowText是一個Windows API函數(shù)。該函數(shù)改變指定窗口的標(biāo)題欄的文本內(nèi)容return;void CMy0907Dlg:OnBnClickedPlayStop()/ TODO: 在此添加控件通知處理程序代碼Invalidate();if (!bPlaying) return ;bEnding=TRUE;w

47、aveOutReset(hWaveOut);return ;LRESULT CMy0907Dlg:OnMM_WOM_OPEN(UINT wParam, LONG lParam)TRACE("open MM_WOM_OPENn");/ Set up headerpWaveHdr1->lpData = (LPTSTR)pSaveBuffer ;pWaveHdr1->dwBufferLength = dwDataLength ;pWaveHdr1->dwBytesRecorded = 0 ;pWaveHdr1->dwUser = 0 ;pWaveHdr1->dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP ;pWaveH

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論