私は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を置き換えることができると考えれば非常に素晴らしいものです。私が抱えている問題は、PlaybackState
がPlaying
にとどまり、PlaybackStoppedが一度起動するとStopped
に変更されるということではありません。そのことを巡って、私はPlaybackStopped
に登録し、そこでStop()
と呼んでいます。
私はStop()
と呼ぶ必要がありますか、それとも私がここで欠けているものがありますか?
ない私は精通していたクラスを、多くのオブジェクトが上げます」停止中 "のイベントをキャンセルしたい場合は、状態を簡単に変更できます。イベントはキャンセル可能ですか? –