2011-06-15 102 views
3

我剛剛發現NAudio,我一直在玩它。我已經寫了一個簡單的窗體程序,它有一個加載按鈕(加載一個特定的.wav歌曲)和按鈕來播放,暫停,停止,淡入聲音(我自己添加的功能使用定時器和逐漸增加的音量),和淡出聲音。我也有一個trackbar控件來處理音量。我創建了一個包裝類來放置所有的NAudio,並且在聲音開始或暫停時添加額外的功能,如淡入/淡出和事件通知。使用NAudio加載.wav後退出程序時出現錯誤

好吧,所有的說,這工作正常。該程序正確加載,播放,暫停,停止和淡入淡出。音量軌跡欄正確反映正在播放的歌曲的音量級別。這很有用,但我確實有兩個問題。

首先,我點擊「Load」按鈕後加載聲音,然後做一切我想要(或不)播放,當我退出程序,我得到以下彈出錯誤消息(「斷言失敗」 ):「AcmStreamHeader dispose未在AcmStreamHeader.Finalize()中調用」。這是那些「中止,重試,忽略」彈出窗口中的一個,但幾秒鐘後消失,項目終止。 (注意:加載功能會創建DirectSoundOut並調用CreateInputStream ...直接從網站上的NAudio採樣中獲取,並且還會爲所定義的事件設置事件處理程序,但這可能無關緊要。)

In類的析構函數,我做了以下調用:

mainOutputStream.Close(); 
mainOutputStream.Dispose(); 
waveOutDevice.Dispose(); 

但我仍然得到錯誤。這是最大的問題,我會在另一個線索中詢問另一個問題。任何想法爲什麼這是發生,我怎麼能阻止它?

我在Windows 7 32位上運行VS 10。

回答

4

錯誤的最可能原因(它實際上只是一個Debug.Assert - 它在NAudio的發佈版本中不會發生),mainOutputStream被分配給多個WaveStream,當您更改它時, t處置舊的。當您退出應用程序時,垃圾收集器將運行並觸發此Debug.Assert。

幾個其他點:

  • 沒有必要調用mainOutputStream.Close和處置。只需打電話給他們其中一人
  • 您的清理代碼不應該在類析構函數(終結器?)中,而是在Dispose方法中,在關閉或關閉事件處理程序中,對於表單。
  • 編輯:另一個可能的原因是,你從WaveStream派生,並且在你的覆蓋中Dispose方法沒有調用任何屬於類成員的WaveStream上的Dispose。
+0

好的,我添加了一個dispose方法,並確保它在程序退出時被調用,並且問題消失。謝謝你的提示。 順便說一下,是否有API文檔顯示NAudio類並解釋其成員?那會很有幫助。 謝謝,馬克。 – Matthew 2011-06-16 14:13:40

+0

還有一個問題,Mark。我使用下面的代碼來播放聲音:waveOutDevice = new WaveOut(); mainOutputStream = CreateInputStream(fileName); waveOutDevice.Play();我的問題是這樣的... waveOutDevice是否需要音頻設備的獨佔使用,或者我的班級有多個對象可以播放他們的聲音...甚至可能同時播放?我所做的只是播放聲音文件,而不是任何幻想。 – Matthew 2011-06-16 14:19:33

+0

所有的NAudio類都有面向公衆的API的XML文檔。其他文檔和教程可以在CodePlex網站的文檔選項卡上找到。 – 2011-06-16 14:35:48

相關問題