我正在使用NAudio库并且在调用方法时遇到问题。我创建了一个用于播放音频文件的类,并为按钮点击指定了bool值。一切正常,除了我的代码的IF部分将运行,直到调用方法(if代码的行)。没有生成错误,它只是没有进入OnPlaybackStopped方法。我也在输出一些文本,所以我可以确认这一点,并且在两种情况下都看到PlaybackStopped是真实的。 ELSE部分运行没有问题,并且一旦到达文件末尾,实际上调用该方法没有问题。有什么想法吗?我知道我可能只是错过了一些简单的东西,只需要另一组眼睛来告诉我我做错了什么。
namespace AudioTool
{
public class Playback
{
private IWavePlayer _audioPlayback { get; set; }
private AudioFileReader _audioReader { get; set; }
private WaveViewer _waveViewer { get; set; }
private Button _playButton { get; set; }
private Button _stopButton { get; set; }
private bool _stopButtonClick { get; set; }
public Playback(IWavePlayer audioPlayback, AudioFileReader audioReader, WaveViewer waveViewer, Button playButton, Button stopButton, bool stopButtonClick)
{
_audioPlayback = audioPlayback;
_audioReader = audioReader;
_waveViewer = waveViewer;
_playButton = playButton;
_stopButton = stopButton;
_stopButtonClick = stopButtonClick;
}
public void CreateAudioPlayback(string audioPath)
{
string fullAudioPath = (audioPath);
_audioPlayback = new WaveOut();
_audioReader = new AudioFileReader(fullAudioPath);
_audioPlayback.Init(_audioReader);
if (_stopButtonClick == true)
{
Console.WriteLine(_stopButtonClick);
Console.WriteLine(_audioPlayback.PlaybackState);
_audioPlayback.PlaybackStopped += new EventHandler<StoppedEventArgs>(OnPlaybackStopped);
}
else
{
// Get file path and playback
_audioPlayback.PlaybackStopped += new EventHandler<StoppedEventArgs>(OnPlaybackStopped);
_audioPlayback.Play();
// View the waveform of the report
_waveViewer.WaveStream = new WaveFileReader(fullAudioPath);
}
}
private void OnPlaybackStopped(object sender, StoppedEventArgs e)
{
_waveViewer.WaveStream.Dispose();
_audioPlayback.Stop();
_audioPlayback.Dispose();
_audioReader.Dispose();
_waveViewer.WaveStream = null;
_audioPlayback = null;
_audioReader = null;
_playButton.Enabled = true;
}
}
}
答案 0 :(得分:1)
弄清楚发生了什么。当我点击一个课程上的“播放”按钮时(我们将其称为main.cs),它开始通过一个音频流中的WaveOut播放音频。然后,当我单击main.cs中的停止按钮时,它试图停止新的音频流。因此,与音频相关的功能(例如停止)似乎没有任何影响,因为他们总是试图阻止没有播放任何内容的音频流。
我解决这个问题的方法是在main.cs中添加几行代码,以便在那里定义WaveOut,然后每个Play和Stop按钮都会引用该类,其余的代码。