2011-12-30 2 views
2

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

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

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

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

Спасибо. Я собираюсь попробовать это сразу –

+0

Я не уверен, что я помещаю вышеуказанный фрагмент в нужное место, но всякий раз, когда я это делаю, я получаю эту синтаксическую ошибку: «Невозможно неявно преобразовать тип« NAudio.Wave.WaveOut »в« NAudio .Wave.DirectSoundOut». Означает ли это, что я не должен использовать DirectSoundOut? –

+1

Вы должны изменить объявление 'private NAudio.Wave.DirectSoundOut output = null;' в 'private NAudio.Wave.WaveOutoutput = null;' –