NAudio.MmException - PullRequest
       45

NAudio.MmException

2 голосов
/ 30 декабря 2011

Я экспериментирую с тем, как играть в mp3 с помощью Naudio.Мое простое приложение имеет одну форму окна и одну кнопку для воспроизведения / приостановки музыки.Однако в приложении есть две основные проблемы:

Хотя предполагалось, что если музыка воспроизводится и кнопка воспроизведения нажата, приложение должно прекратить воспроизведение.Вместо этого при повторном нажатии кнопки приложение перезапускает музыку, а затем (иногда) выдает исключение. Если кнопка нажимается два или три раза (и без каких-либо задержек), приложение вызывает исключение NAudio.MmException (Message = 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();
        }
    }
}

1 Ответ

1 голос
/ 30 декабря 2011

Если посмотреть на источник DirectSoundOut , реализация Play и Pause не поддерживает возобновление.А именно, то, что происходит с вами, именно то, что и должно.Вызов игры всегда начинается с начала потока.Вы должны использовать WaveOut вместо этого.Он поддерживает возобновление путем повторного вызова Play, как и в вашем коде.

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