gpt4 book ai didi

naudio - 使用 NAudio 加载 .wav 后退出程序时出现错误

转载 作者:行者123 更新时间:2023-12-02 04:01:52 28 4
gpt4 key购买 nike

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

好吧,总而言之,效果很好。程序正确加载、播放、暂停、停止以及淡入和淡出。音量轨迹栏正确反射(reflect)了正在播放的歌曲的音量级别。这很有效,但我确实有两个问题。

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

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

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

但我仍然收到错误。这是一个大问题,我将在另一个线程中问另一个问题。知道为什么会发生这种情况以及如何阻止它吗?

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

最佳答案

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

其他几点:

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

关于naudio - 使用 NAudio 加载 .wav 后退出程序时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6361202/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com