我正在为现有的音频/视频应用程序添加跨平台CD读取支持。对于Linux,我将ioctl()
与SG_IO
一起使用,并且在那里一切正常。同步调用CD扇区将在1-4毫秒内按预期进行。我使用ATAPI CDB命令READ CD
或READ CD MSF
从驱动器取回扇区数据。我还应该注意,这些读取呼叫每帧视频只会发生一次,通常是每1/60秒。
但是在Windows上,使用DeviceIoControl()
和IOCTL_SCSI_PASS_THROUGH_DIRECT
做同样的事情,一些测试人员报告说他们的系统似乎和Linux一样运行良好,而其他测试人员则认为返回系统的延迟非常高。相同数量的数据。我在不同的系统上看到过40-200 + ms的任何时间,甚至只是对于单个扇区读取(在这种情况下为2352字节)。
在这些有问题的系统上(在旧硬件和新硬件以及内部SATA和USB驱动器上,已经显示出多个问题),这个问题似乎更加陌生,因为我实际上可以请求很多更多数据,并且延迟不会改变。例如,1个扇区对16个扇区可能仍需要100毫秒来检索。但是,MMC规范似乎并未提供任何标准或查询方法来说明一个特定驱动器一次可以检索多少个扇区,这使得该方法似乎很难以可预测的方式实施。
我已经尝试了通常的故障排除步骤,以确保系统上没有其他任何运行或使用CDROM的驱动器,没有运行防病毒/恶意软件,已应用所有系统更新,重新启动系统/重新启动几次等。从7到10尝试了多个Windows版本,包括服务器版本。还要确保我所有的缓冲区都是页面对齐的,但这似乎无济于事。
为什么此延迟如此之高,仅在某些系统上如此?可以采取任何措施来解决此问题,还是必须实现某种类型的预读高速缓存,以某种方式考虑到特定于驱动器的延迟和每个呼叫的最大扇区数?