如果我创建一个AsioOut并使用MultiplexingWaveProvider它只能在MultiplexingWaveProvider用完数据之前调用AsioOut.Stop()时才能正常工作(播放/处理等)。
如果我等到MultiplexingWaveProvider数据耗尽(并且AsioOut触发了PlaybackStopped事件)我无法处理AsioOut它只是挂起并且永远不会返回(没有错误)。注意:MultiplexingWaveProvider上没有Dispose(),但我尝试在用于MultiplexingWaveProvider的所有WaveFileReader上调用dispose。
答案 0 :(得分:2)
我有几个人在尝试自动停止时报告ASIO驱动程序的问题。如果在缓冲区交换回调中调用stop,可能有些驱动程序不喜欢它。
理想情况下,应更新AsioOut
以提供禁用自动停止的选项。你可以通过创建一个永无止境的ISampleProvider
来模拟这个,Read
方法在到达源结束后返回静默。然后,您可以轮询以查看输入结束的时间,然后Stop
和Dispose
完成后
答案 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;
}