Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# naudio Can';使用MultiplexingWaveProvider时,不要处理Asio_C#_.net_Naudio_Asio - Fatal编程技术网

C# naudio Can';使用MultiplexingWaveProvider时,不要处理Asio

C# naudio Can';使用MultiplexingWaveProvider时,不要处理Asio,c#,.net,naudio,asio,C#,.net,Naudio,Asio,如果我创建一个AsioOut并使用MultiplexingWaveProvider,则只有在MultiplexingWaveProvider的数据用完之前调用AsioOut.Stop()时,它才能正常工作(播放/处理等) 如果我等到MultiplexingWaveProvider的数据用完(并且Asiout触发了一个PlaybackStopped事件),我就无法处理Asiout,因为它会挂起并且永远不会返回(没有错误)。注意:MultiplexingWaveProvider上没有Dispose(

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


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

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


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

这是我对Mark答案的理解。我不得不使用iWaveProvider,因为我使用的MultiplexingWaveProvider不支持iSampleProvider。(我还可以实现一个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;
            }

我尝试了第三个(我已经用两个)ASIO设备,它可以自动停止。我将处理ISampleProvider。记录在案:我和Asio4All有过争执,而贝林格x32(我的NI Traktor工作过)马克·希思的回答是正确的。请参阅下面我的代码,了解我是如何处理它的。