linux - SDL 音频在 Linux 上随机失真

标签 linux audio sdl distortion

我对 SDL 音频有一个奇怪的问题。它会随机变形。它完全是随机的,我根本无法可靠地重现它。有时它在程序启动几秒钟后开始失真,有时我已经玩过该软件,让它运行一整夜,早上它仍然可以工作。

这可能与 SDL 有关,因为我可以使用 Mix_CloseAudio() 关闭混音器,然后使用 Mix_OpenAudio() 重新打开它,它会修复声音……有一段时间,有时很长一段时间,其他时候很快就会搞砸。 (正如 Brad 在评论中指出的那样,这并不一定意味着这是一个 SDL 问题)。

关于系统的更多信息:

  • 使用内核 2.6.27.5-117.fc10.i686 精简了 linux 系统。
  • libSDL_mixer-1.2.so.0.2.6。

这是一个过去一直有效的遗留系统,我没有对软件的音频系统部分进行任何更改。该系统过去使用 CD-rom 运行,所有游戏 Assets 都加载到文件系统覆盖上的 ram 中,但我已将其切换为使用 CF 卡运行,而 ram 中的所有声音始终没有。我也没有对声音驱动程序进行任何更改。

这是一个声音失真的例子 https://www.youtube.com/watch?v=zEneMi5mtt0
这是相同声音正常运行的示例 https://www.youtube.com/watch?v=nyPZLJ-9gsI

最佳答案

根据您的声音我们可以用来调试问题的一些观察结果:

  • 您听到的失真基于您的声音,是一系列有规律的咔哒声。
  • 如果音频很安静,则失真/咔嗒声很小。同样,随着音频​​变大,问题会变得更糟。
  • 音高是正确的,所以这不是采样率问题。
  • 一旦问题开始,它就是一致的。

基本上,发生的事情是声卡从循环缓冲区中读取的位置与写入它的软件认为的位置不同。在某些时候,缓冲区欠载导致播放头位于读取头前面。

应该发生的是播放应该重置,导致音频暂时中断,直到缓冲区再次满为止。似乎发生的事情是播放继续。因此,播放头一直在旧缓冲区数据和新缓冲区数据之间的线上运行,从而导致卡嗒声。这也是为什么当声音更安静时,卡嗒声/失真也更安静……两个 PCM 样本之间的差异更小。

我已经看到这种情况发生在有问题的声卡驱动程序和有问题的声卡上。要解决此问题,请找到增加缓冲区大小的方法。这会增加延迟,但可能有助于从一开始就防止问题发生。

关于linux - SDL 音频在 Linux 上随机失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57838305/

相关文章:

linux - dnstop 与 savefile 无输出

java - MakeFile 不工作?

c++ - SDL_PollEvent 深入

audio - SDL音频问题(无输出)

linux - 为 mod_perl 更改 perl

java - (Linux) 如果 ssh 关闭,如何取回 java 应用程序(等待输入)?

ios - 修剪长度在音频修剪iOS中出现错误

iphone - 将Auriotouch线性刻度更改为对数

javascript - 如何在网站的移动设备上录制音频?

c++ - 如何在 24 位 SDL_Surface 上设置像素的颜色?