C# NAudio.mException

C# NAudio.mException,c#,mp3,media-player,wav,naudio,C#,Mp3,Media Player,Wav,Naudio,我正在试验如何使用Naudio播放mp3。我的简易应用程序有一个windows窗体和一个播放/暂停音乐的按钮。然而,该应用程序有两个主要问题: 如果音乐正在播放且按下播放按钮,则应用程序应停止播放。相反,当再次按下按钮时,应用程序会重新启动音乐,然后(有时)抛出异常 如果按下按钮两到三次(且没有任何延迟),应用程序将抛出NAudio.MmException(消息=InvalidParameter调用acmStreamClose) 有人能告诉我我的代码出了什么问题吗?下面是我的代码: using

我正在试验如何使用Naudio播放mp3。我的简易应用程序有一个windows窗体和一个播放/暂停音乐的按钮。然而,该应用程序有两个主要问题:

如果音乐正在播放且按下播放按钮,则应用程序应停止播放。相反,当再次按下按钮时,应用程序会重新启动音乐,然后(有时)抛出异常 如果按下按钮两到三次(且没有任何延迟),应用程序将抛出NAudio.MmException(消息=InvalidParameter调用acmStreamClose) 有人能告诉我我的代码出了什么问题吗?下面是我的代码:

using System;
using System.Windows.Forms;
namespace NaudioTesting
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private NAudio.Wave.BlockAlignReductionStream stream = null;

        private NAudio.Wave.DirectSoundOut output = null;


        public void LoadFile(string filePath)
        {
            DisposeWave();

            if (filePath.EndsWith(".mp3"))
            {
                NAudio.Wave.WaveStream pcm =
                    NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(new NAudio.Wave.Mp3FileReader(filePath));
                stream = new NAudio.Wave.BlockAlignReductionStream(pcm);
            }
            else if (filePath.EndsWith(".wav"))
            {
                NAudio.Wave.WaveStream pcm = new NAudio.Wave.WaveChannel32(new NAudio.Wave.WaveFileReader(filePath));
                stream = new NAudio.Wave.BlockAlignReductionStream(pcm);
            }
            else throw new InvalidOperationException("Not a correct audio file type.");

            output = new NAudio.Wave.DirectSoundOut();
            output.Init(stream);
            output.Play();
        }

        private void playPauseButton_Click(object sender, EventArgs e)
        {
            string filePath = "GetLoud.mp3";
            LoadFile(filePath);
            if (output != null)
            {
                if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing) output.Pause();
                else if (output.PlaybackState == NAudio.Wave.PlaybackState.Paused) output.Play();
            }
        }

        private void DisposeWave()
        {
            try
            {
                if (output != null)
                {
                    if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing) output.Stop();
                    output.Dispose();
                    output = null;
                }
                if (stream != null)
                {
                    stream.Dispose();
                    stream = null;
                }
            }
            catch (NAudio.MmException)
            {
                throw;
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            DisposeWave();
        }
    }
}
从源代码看,Play和Pause的实现不支持恢复。也就是说,发生在你身上的事情正是它应该发生的。调用play总是从流的开始开始。 您应该使用
WaveOut
。它支持通过再次调用
Play
来恢复,就像代码中的一样

output = new NAudio.Wave.WaveOut();

我不确定是否将上述代码段放在了正确的位置,但每当我这样做时,就会出现以下语法错误:“无法将类型'NAudio.Wave.WaveOut'隐式转换为'NAudio.Wave.DirectSoundOut'。这是否意味着我根本不应该使用DirectSoundOut?您应该更改
private NAudio.Wave.DirectSoundOut output=null的声明
into
private NAudio.Wave.WaveOutoutput=null非常感谢您的帮助。你的建议很有帮助。事实上,似乎我必须解决这些问题。第一个是我使用directsoundOut而不是WaveOut。第二个问题是,我没有在每次单击按钮时检查输出是否为空。