NAudio PlaybackState永远不会停止?

时间:2013-06-09 15:27:44

标签: c# .net audio naudio

我正在使用 NAudio 创建一个简单的音频播放器,但我找不到可以将PlaybackState流的WaveOut更改为“已停止”的解决方案并因此触发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);

        }

最初,我使用的是DirectSoundOut而不是WaveOut类,我能够解决这个问题,但是这个问题不支持Resuming。

我知道有很多人已经遇到过这个问题,但两种情况都有替代方法(恢复和解雇PlaybackState)?

2 个答案:

答案 0 :(得分:2)

您必须将WaveCallbackInfo添加到WaveOut类的构造函数中以获取引发的事件。

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

答案 1 :(得分:2)

摆脱BlockAlignConversionStreamWaveFormatConversionStreamMp3FileReader直接发出PCM(假设您使用的是最新版本的NAudio)。