2011-06-15 105 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

相关问题