naudio使用MultiplexingWaveProvider时无法处理Asio

时间:2015-07-09 13:05:58

标签: c# .net naudio asio

如果我创建一个AsioOut并使用MultiplexingWaveProvider它只能在MultiplexingWaveProvider用完数据之前调用AsioOut.Stop()时才能正常工作(播放/处理等)。

如果我等到MultiplexingWaveProvider数据耗尽(并且AsioOut触发了PlaybackStopped事件)我无法处理AsioOut它只是挂起并且永远不会返回(没有错误)。注意:MultiplexingWaveProvider上没有Dispose(),但我尝试在用于MultiplexingWaveProvider的所有WaveFileReader上调用dispose。

2 个答案:

答案 0 :(得分:2)

我有几个人在尝试自动停止时报告ASIO驱动程序的问题。如果在缓冲区交换回调中调用stop,可能有些驱动程序不喜欢它。

理想情况下,应更新AsioOut以提供禁用自动停止的选项。你可以通过创建一个永无止境的ISampleProvider来模拟这个,Read方法在到达源结束后返回静默。然后,您可以轮询以查看输入结束的时间,然后StopDispose完成后

答案 1 :(得分:0)

这是我对马克回答的褒奖。我不得不使用IWaveProvidor,因为我使用的MultiplexingWaveProvider不支持ISampleProvidor。 (我本可以实现一个MultiplexingWaveProvider来获得我认为的相同结果)。请注意,该任务过去没有在数据处理程序中调用stop。

  public class AsioWavProvidor :IWaveProvider
        {
            private bool EndSignaled = false;
            public Action EndofAudioData;
            public Mp3FileReader Mp3Reader;
            public AsioWavProvidor(string mp3File)
            {
                Mp3Reader = new Mp3FileReader(mp3File);
            }
            public TimeSpan CurrentTime { get { return Mp3Reader.CurrentTime; } }


 public int Read(byte[] buffer, int offset, int count)
            {
                var retCount = Mp3Reader.Read(buffer, offset, count);
                if (retCount == 0)
                {
                   if (EndofAudioData != null && !EndSignaled)
                    {

                        EndSignaled = true;
                        System.Threading.Tasks.Task.Run(() =>
                        {
                            try
                            {
                                EndofAudioData();
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(ex);
                            }
                        });

                    }
                    return count;
                }
                return retCount;
            }