SDL 音频在 Linux 随机失真
SDL audio randomly becomes distorted on Linux
我对 SDL 音频有一个奇怪的问题。它会随机变形。它完全是随机的,我根本无法可靠地重现它。有时它在程序启动几秒钟后开始失真,有时我已经玩过该软件,让它 运行 过夜,它在早上仍然可以工作。
它可能与 SDL 有关,因为我可以用 Mix_CloseAudio()
关闭混音器,然后用 Mix_OpenAudio()
重新打开它,它会修复声音......一段时间,有时很长一段时间,其他时候很快就会搞砸。 (正如 Brad 在评论中指出的那样,这并不一定意味着这是一个 SDL 问题)。
关于系统的更多信息:
- 精简 linux 内核为 2.6.27.5-117.fc10.i686 的系统。
- libSDL_mixer-1.2.so.0.2.6.
这是一个过去一直有效的遗留系统,我对软件的音频系统部分没有做任何更改。该系统过去是 运行 从 CD-rom 上关闭,所有游戏的资产都加载到文件系统覆盖上的 ram 中,但我已经将它切换到 运行 从 CF 卡上关闭,没有所有声音一直在 ram 中。我也没有对声音驱动程序进行任何更改。
这是一个声音失真的例子https://www.youtube.com/watch?v=zEneMi5mtt0
这是相同声音正常运行的示例https://www.youtube.com/watch?v=nyPZLJ-9gsI
根据您的声音我们可以用来调试问题的一些观察结果:
- 您听到的失真基于您的声音,是一系列有规律的咔哒声。
- 如果音频安静,则 distortion/clicks 也安静。同样,随着音频变大,问题会变得更糟。
- 音高是正确的,所以这不是采样率问题。
- 问题一开始,就是一致的。
基本上,发生的事情是声卡从循环缓冲区读取的位置与写入它的软件认为的位置不同。在某些时候,缓冲区欠载导致播放头位于读取头前面。
应该发生的是播放应该重置,导致音频暂时中断,直到缓冲区再次满为止。似乎发生的事情是播放继续。因此,播放头将 运行 保持在旧缓冲区数据和新缓冲区数据之间的一条线上,从而导致点击。这也是为什么当声音越小,click/distortion越小...两个PCM样本之间的差异越小。
我已经看到这种情况发生在有问题的声卡驱动程序和有问题的声卡上。要解决此问题,请找到增加缓冲区大小的方法。这会增加延迟,但可能有助于从一开始就防止问题发生。
我对 SDL 音频有一个奇怪的问题。它会随机变形。它完全是随机的,我根本无法可靠地重现它。有时它在程序启动几秒钟后开始失真,有时我已经玩过该软件,让它 运行 过夜,它在早上仍然可以工作。
它可能与 SDL 有关,因为我可以用 Mix_CloseAudio()
关闭混音器,然后用 Mix_OpenAudio()
重新打开它,它会修复声音......一段时间,有时很长一段时间,其他时候很快就会搞砸。 (正如 Brad 在评论中指出的那样,这并不一定意味着这是一个 SDL 问题)。
关于系统的更多信息:
- 精简 linux 内核为 2.6.27.5-117.fc10.i686 的系统。
- libSDL_mixer-1.2.so.0.2.6.
这是一个过去一直有效的遗留系统,我对软件的音频系统部分没有做任何更改。该系统过去是 运行 从 CD-rom 上关闭,所有游戏的资产都加载到文件系统覆盖上的 ram 中,但我已经将它切换到 运行 从 CF 卡上关闭,没有所有声音一直在 ram 中。我也没有对声音驱动程序进行任何更改。
这是一个声音失真的例子https://www.youtube.com/watch?v=zEneMi5mtt0
这是相同声音正常运行的示例https://www.youtube.com/watch?v=nyPZLJ-9gsI
根据您的声音我们可以用来调试问题的一些观察结果:
- 您听到的失真基于您的声音,是一系列有规律的咔哒声。
- 如果音频安静,则 distortion/clicks 也安静。同样,随着音频变大,问题会变得更糟。
- 音高是正确的,所以这不是采样率问题。
- 问题一开始,就是一致的。
基本上,发生的事情是声卡从循环缓冲区读取的位置与写入它的软件认为的位置不同。在某些时候,缓冲区欠载导致播放头位于读取头前面。
应该发生的是播放应该重置,导致音频暂时中断,直到缓冲区再次满为止。似乎发生的事情是播放继续。因此,播放头将 运行 保持在旧缓冲区数据和新缓冲区数据之间的一条线上,从而导致点击。这也是为什么当声音越小,click/distortion越小...两个PCM样本之间的差异越小。
我已经看到这种情况发生在有问题的声卡驱动程序和有问题的声卡上。要解决此问题,请找到增加缓冲区大小的方法。这会增加延迟,但可能有助于从一开始就防止问题发生。