2010-05-11 51 views
2

当使用NAudio播放MP3文件[在控制台中]时,我无法弄清楚如何停止播放。当我调用waveout.Stop()时,代码停止运行,waveout.Dispose()永远不会被调用。NAudio播放不会成功停止

它与函数回调有关吗?如果是这样,我该如何解决它?

static string MP3 = @"song.mp3"; 
static WaveOut waveout; 
static WaveStream playback; 
static void Main(string[] args) 
{ 
    waveout = new WaveOut(WaveCallbackInfo.FunctionCallback()); 
    playback = OpenMp3Stream(MP3); 
    waveout.Init(playback); 
    waveout.Play(); 
    Console.WriteLine("Started"); 

    Thread.Sleep(2 * 1000); 

    Console.WriteLine("Ending"); 
    if (waveout.PlaybackState != PlaybackState.Stopped) 
     waveout.Stop(); 
    Console.WriteLine("Stopped"); 
    waveout.Dispose(); 
    Console.WriteLine("1st dispose"); 
    playback.Dispose(); 
    Console.WriteLine("2nd dispose"); 
} 
private static WaveChannel32 OpenMp3Stream(string fileName) 
{ 
    WaveChannel32 inputStream; 
    WaveStream mp3Reader = new Mp3FileReader(fileName); 
    WaveStream pcmStream = WaveFormatConversionStream.CreatePcmStream(mp3Reader); 
    WaveStream blockAlignedStream = new BlockAlignReductionStream(pcmStream); 
    inputStream = new WaveChannel32(blockAlignedStream); 
    return inputStream; 
} 
+0

我有一种感觉'使用'声明在这里非常方便,但我没有naudio,所以我不能真正地测试它。 – 2010-05-11 15:21:32

+0

以及这只是示例代码,我不认为使用using语句在长期运行中确实有效。它实际上并没有从waveout.Stop()中实际返回。它进入功能,似乎根本没有离开。 – Kurru 2010-05-11 20:56:37

回答

2

你是说代码挂在waveOutReset的调用中?如果是这样,这是一个已知的函数回调和某些音频驱动程序的问题(SoundMAX似乎特别容易受此影响)。几个月前,我检查了NAudio源代码的一个可能修复方法,因此您可以尝试构建最新的代码并查看是否可以解决问题。

+0

谢谢,这是问题所在。现在修复,谢谢:D – Kurru 2010-05-12 11:35:46

+0

太棒了!很高兴我偶然发现了这一点。我有同样的问题。 – senfo 2011-01-17 21:25:23

0

我第一次在这里的猜测是,因为你没有console.read()或类似的电话,你的代码只是执行如此之快,你没有看到最终写入线。

如果NAudio实现IDisposable,那么我会推荐使用using语句让.NET为您处理这个问题。