C# 纳迪奥的后卫状态从未停止过?

C# 纳迪奥的后卫状态从未停止过?,c#,.net,audio,naudio,C#,.net,Audio,Naudio,我正在使用NAudio创建一个简单的音频播放器,但我找不到一个解决方案,可以将WaveOut流的PlaybackState更改为Stopped,从而触发PlaybackState事件 我是这样做的,如下所示: private BlockAlignReductionStream stream = null; private NAudio.Wave.WaveOut output = null; private void Add_to_stream() {

我正在使用NAudio创建一个简单的音频播放器,但我找不到一个解决方案,可以将WaveOut流的PlaybackState更改为Stopped,从而触发PlaybackState事件

我是这样做的,如下所示:

private BlockAlignReductionStream stream = null;

private NAudio.Wave.WaveOut output = null;

private void Add_to_stream()
        {

            string[] files = Directory.GetFiles(Settings.Default.m + "\\","*"+selected_music+"*");

            if (files[0].EndsWith(".mp3"))
            {
                NAudio.Wave.Mp3FileReader mp3fr = new NAudio.Wave.Mp3FileReader(Settings.Default.m + "\\" + selected_music + ".mp3");
                var pcm = NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(mp3fr);
                stream = new NAudio.Wave.BlockAlignReductionStream(pcm);

            }
            else if (files[0].EndsWith(".wav"))
            {
                NAudio.Wave.WaveFileReader wavfr = new NAudio.Wave.WaveFileReader(Settings.Default.m + "\\" + selected_music + ".wav");
                var pcm = new NAudio.Wave.WaveChannel32(wavfr);
                pcm.PadWithZeroes = false;
                stream = new NAudio.Wave.BlockAlignReductionStream(pcm);
            }
            else throw new InvalidOperationException("file type is not supported.");

            output = new NAudio.Wave.WaveOut();
            output.Init(stream);

        }
最初,我使用的是代替类,我能够克服这个问题,但这个问题不支持恢复


我知道有很多人已经遇到了这个问题,但是对于恢复和启动PlaybackState这两件事,是否有其他选择?

您必须在WaveOut类的构造函数中添加WaveCallbackInfo才能引发事件

output = new NAudio.Wave.WaveOut(WaveCallbackInfo.FunctionCallback());
output.PlaybackStopped += (pbss, pbse) => { Debug.WriteLine("Stopped"); };

您必须将WaveCallbackInfo添加到WaveOut类的构造函数中才能引发事件

output = new NAudio.Wave.WaveOut(WaveCallbackInfo.FunctionCallback());
output.PlaybackStopped += (pbss, pbse) => { Debug.WriteLine("Stopped"); };

摆脱块对齐转换流和波形转换流。假设您使用的是最新版本的NAudio,Mp3FileReader会直接发出PCM。

摆脱BlockAlignConversionStream和WaveFormatConversionStream。MP3FiReReADER直接假设你使用的是NoAdio的最新版本,它是PCM。

我已经完成了你所说的,但是实际上它并不能正常工作,如果它是第一次接收到一个值:只有在下一首歌的中间发生了这个事件,它才起作用。只有在调用对象Dispose/Close方法后调用Stop或设置WaveOutEvent回调时,它才会调用引发事件。@rene我不确定这是什么意思我已经按照你说的做了,但实际上它工作不正常,只有当流第一次接收到一个值时,它才起作用:事件在下一首歌曲的中间发生。你必须记住,在不同的线程上处理波的播放。只有在调用对象Dispose/Close方法后调用Stop或设置WaveOutEvent回调时,它才会调用引发事件。@rene我不确定这意味着什么,它工作得很好,谢谢!我现在唯一的问题是将另一个值传递给output.Init。我使用了一个新的EventHandler在PlaybackState事件触发时抛出一条消息并处理输出,但是,当我调用一个过程来完成任务的其余部分,即使用output.Init时,它会忽略下面的所有行,顺便说一句,不会发生任何错误消息。。我在调试的时候感觉到了,好像时间不够让事件调用另一个东西,它只是简单地中断了。它工作得很好,谢谢!我现在唯一的问题是将另一个值传递给output.Init。我使用了一个新的EventHandler在PlaybackState事件触发时抛出一条消息并处理输出,但是,当我调用一个过程来完成任务的其余部分,即使用output.Init时,它会忽略下面的所有行,顺便说一句,不会发生任何错误消息。。我在调试时感觉到了这一点,就好像时间不足以让事件调用另一个东西,它就这样中断了。