2012-04-20 6 views
3

私はNAudioを使うのにちょっと新しいので、私は確かに何か重要なものを欠いているので、この質問です。 (PlaybackStateが発生した後にPlaybackStateがPlayingに残るのはなぜですか?

public class AudioPlayer : IDisposable 
{ 
    WaveStream _waveStream; // sound data stream 
    WaveChannel32 _waveChannel32; // sound channel ?? 
    IWavePlayer _iWavePlayer; // sound output driver 

    public bool IsPlaying 
    { 
     get { return _iWavePlayer != null 
        && _iWavePlayer.PlaybackState 
         != Wave.PlaybackState.Stopped; } 
    } 

    public PlaybackState PlaybackState 
    { 
     get { return _iWavePlayer.PlaybackState; } 
    } 

    public void LoadMp3(byte[] mp3Bytes) 
    { 
     Load(CreateInputStreamFromMp3Bytes(mp3Bytes)); 
    } 

    public void LoadFile(string filename) 
    { 
     Load(CreateInputStream(filename)); 
    } 

    void Load(WaveStream waveStream) 
    { 
     if (_iWavePlayer != null) 
      Dispose(); 
     _iWavePlayer = new WaveOut(); 
     _iWavePlayer.PlaybackStopped += 
      new EventHandler(_iWavePlayer_PlaybackStopped); 
     _waveStream = waveStream; 
     _waveChannel32 = new WaveChannel32(_waveStream); 
     _waveChannel32.PadWithZeroes = false; 
     _iWavePlayer.Init(_waveChannel32); 
    } 

    void _iWavePlayer_PlaybackStopped(object sender, EventArgs e) 
    { 
     Stop(); 
    } 

    static WaveStream CreateInputStreamFromMp3Bytes(byte[] mp3Bytes) 
    { 
     return new Mp3FileReader(new MemoryStream(mp3Bytes), false); 
    } 

    static WaveStream CreateInputStream(string fileName) 
    { 
     if (fileName.EndsWith(".wav")) 
      return new WaveFileReader(fileName); 
     else if (fileName.EndsWith(".mp3")) 
      return new Mp3FileReader(fileName); 
     else 
      throw new InvalidOperationException("Unsupported extension"); 
    } 

    public void Play() 
    { 
     _iWavePlayer.Play(); 
    } 

    public void Stop() 
    { 
     if (_iWavePlayer != null 
       && _iWavePlayer.PlaybackState != PlaybackState.Stopped) { 
      _iWavePlayer.Stop(); 
      _waveStream.Position = 0; 
     } 
    } 

    public void Dispose() 
    { 
     Stop(); 
     if (_iWavePlayer != null) { 
      _iWavePlayer.Dispose(); 
      _iWavePlayer = null; 
     } 
     if (_waveChannel32 != null) { 
      _waveChannel32.Dispose(); 
      _waveChannel32 = null; 
     } 
     if (_waveStream != null) { 
      _waveStream.Dispose(); 
      _waveStream = null; 
     } 
    } 
} 

私はMP3ファイルを再生するには、問題のコードを使用しています:例/デモコードを皮切り

は、私は一緒に私はそれがMP3やWAVファイルを再生するために作ることができるような単純なクラスを置きますWAVではない)。

大部分は問題なく動作しますが、これは私のプロジェクトでMediaElementsを置き換えることができると考えれば非常に素晴らしいものです。私が抱えている問題は、PlaybackStatePlayingにとどまり、PlaybackStoppedが一度起動するとStoppedに変更されるということではありません。そのことを巡って、私はPlaybackStoppedに登録し、そこでStop()と呼んでいます。

私はStop()と呼ぶ必要がありますか、それとも私がここで欠けているものがありますか?

+0

ない私は精通していたクラスを、多くのオブジェクトが上げます」停止中 "のイベントをキャンセルしたい場合は、状態を簡単に変更できます。イベントはキャンセル可能ですか? –

答えて

2

バグのようです。 NAudioコードWaveOutを見るとPlaybackStateRaisePlaybackStoppedEventに変更されません。しかし、DirectSoundOutは、それをstoppedに変更します。ちょっとおかしい。このラインLoadメソッドの変更で

::このことにより

_iWavePlayer = new WaveOut(); 

+0

DirectSoundOutには何らかの欠点がありますか?あなたは共有できるMP3を再生するコードをいくつか持っていますか?-)? –

+0

サンプルを気にしないで、私はWaveOutをDirectSoundOutに置き換えました。そして、完了したら、状態を停止に設定します。 –

1

これを試してみてください

_iWavePlayer = new WaveOut(WaveCallbackInfo.FunctionCallback()); 
関連する問題