使用NAudio加载.wav后退出程序时出错

时间:2011-06-15 16:42:07

标签: naudio

前几天我刚刚找到了NAudio,我一直在玩它。我写了一个简单的Windows窗体程序,它有一个加载按钮(加载一个特定的.wav歌曲),以及播放,暂停,停止,淡入声音的按钮(我自己使用定时器添加的功能和逐渐增加的音量),以及淡出声音。我还有一个轨迹栏控件来处理音量。我创建了一个包装类来放入所有NAudio内容,以及在声音开始或暂停时添加额外的功能,如淡入/淡出和事件通知。

好的,所有人都说,这很好。该程序正确地加载,播放,暂停,停止和淡入淡出。音量轨迹栏正确反映了正在播放的歌曲的音量级别。这很有用,但我确实有两个问题。

首先,在我点击“加载”按钮加载声音然后进行我想要(或不是)的所有播放后,当我退出程序时,我收到以下弹出错误消息(“断言失败”) :“未在AcmStreamHeader.Finalize()中调用AcmStreamHeader dispose”。这是“中止,重试,忽略”弹出窗口之一,但几秒后它就会消失,项目终止。 (注意:加载功能创建DirectSoundOut并调用CreateInputStream ...直接从站点上的NAudio样本中获取。它还为已定义的事件设置事件处理程序,但这可能无关紧要。)

在类析构函数中,我进行以下调用:

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

但我仍然得到错误。这是一个很大的问题,我将在另一个问题中提出另一个问题。知道为什么会这样,我怎么能阻止它呢?

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

1 个答案:

答案 0 :(得分:4)

错误的最可能原因(它实际上只是一个Debug.Assert - 它不会发生在NAudio的发布版本中),mainOutputStream被分配给多个WaveStream,当你更改它时,你没有处理旧的。退出应用程序时,垃圾收集器将运行,此Debug.Assert将触发。

其他几点:

  • 无需调用mainOutputStream.Close和Dispose。只需打电话给其中一个。
  • 您的清理代码不应该在类析构函数(终结器?)中,而应该在Dispose方法中,对于Form,在Closing或Closed事件处理程序中。
  • 编辑:另一个可能的原因是您从WaveStream派生并且在您的重写Dispose方法中没有在属于类成员的任何WaveStream上调用Dispose。