我已经阅读了好久关于 Ubuntu 中的 wine 和 pulseaudio 的几个问题,但一直没搞清楚。问题是什么或似乎是与 wine 以及在通过 wine 执行的游戏中默认使用 pulseaudio 的声音有关的问题。这影响了使用 Ubuntu 但仍然希望能够玩特定 Windows 游戏的大量用户。
答案1
最新更新:Wine 1.7.55 增加了适当的 PulseAudio 支持。
这些天来没有什么大问题。
你所描述的是几年前的事了。
Wine 下的应用程序只知道如何与 Windows 声音堆栈对话,因此与大多数其他 Windows 子系统一样,Wine 也提供此功能。问题来自于我们的声音堆栈在过去十年中发生了重大变化。
曾几何时...
... 我们只有 OSS 和 ALSA。它们提供可预测的接口,但编码起来并不容易。Wine 花了很长时间才通过其 ALSA 支持达到“正常工作”的程度。堆栈图非常简单:
Hardware → ALSA → Wine/Win32-api → Windows app
ALSA 的主要问题是,如果你想同时播放多个内容,它会非常挑剔。应用程序可能会意外地将其锁定,不让其他应用程序播放。
随后 PulseAudio 开始流行起来。
突然间,每个桌面都出现了一个叫 PulseAudio 的东西。这是另一层之间应用程序和 ALSA 允许许多应用程序同时发出噪音并添加网络声音等功能。
但 Wine 仍然只知道如何与 ALSA 对话,现在 PulseAudio 的东西从启动时就开始占据它。Wine 的音频必须通过管道传输通过ALSA 兼容层进入 PulseAudio,然后再返回到 ALSA。堆栈显示了这看起来有多糟糕:
Hardware → ALSA → PulseAudio → ALSA emulator → Wine/Win32 → Windows app
此外,ALSA 仿真层(由 PulseAudio 提供)也不太好。它支持几个通道和几个录音选项,但远不及 PulseAudio 本身所依赖的 ALSA。
这感知问题总是“其他人的错”
Wine 中的音频无法正常工作。事后看来,很容易看出问题所在,但当时有三种观点使 Wine 成为真正的战场:
用户要求 Wine 开发人员添加原生 PulseAudio 驱动程序。
葡萄酒开发商不明白为什么他们应该花钱其他他们认为这是 PulseAudio 的问题,因为它没有提供可用的 ALSA 接口。在他们看来,人们只需使用
pasuspender
PA 即可释放较低级别的 ALSA 进行直接操作。PulseAudio 开发人员还建议 Wine 应该集体行动起来,只是添加 PA 驱动程序。其他几十个应用程序都这样做了,为什么它们不能呢?每次我问的时候,PulseAudio ALSA 层都很好,没有错误,问题只是 Wine 开发人员自己的错误。
用户编写了一个入侵的 PulseAudio 驱动程序它直接与 Pulseaudio 对话并自行进行位图音频转换。其他用户喜欢它,因为尽管它存在一些 hack 问题,但它确实经常“正常工作”,但 Wine 开发人员讨厌它,因为它需要维护另一个大型代码分支,而且它是一种 hack。
然后情况就好起来了。
每个人都捐了一点。
用户不再抱怨了。
Wine 经过重构,可以使用 Windows Vista 和 Windows 7 方法来处理声音。他们称之为 MMDevAPI。您可以在这里阅读有关 MMDevAPI 的所有内容。这会删除大量声音代码并简化设置。但它仍然使用 ALSA。
PulseAudio 修复了一些错误以使 Wine 能够更好地运行。
当 MMDevAPI 开始显示出其有效性时,WinePulse 的开发就停止了。
虽然看起来是这样,但我怀疑这不是故事的结局。有商业支持的项目,如 OpenAL 和 GStreamer,它们可以真正简化 Wine 的声音堆栈并提供额外的功能。
但几年后,Wine 1.7.55 增加了主线 PulseAudio 支持……
我已经写了这篇文章好几年了,这可能是迄今为止最奇怪的事情。在放弃 PA 驱动程序开发后,似乎有人又回到了这个问题并将其变成了现实。
不仅如此,它被引入 Wine 的主线版本。
在已建立的前缀中,只需运行wine regedit
并HKCU\Software\Wine\Drivers\Audio
从更改alsa
为pulse
。一切 — 包括环绕声 —似乎开始工作。现在的堆栈如下:
Hardware → ALSA → PulseAudio → Wine/Win32-api → Windows app
它比 ALSA 兼容层好吗?我仍然不确定。我尝试了一些我认为有缺陷的游戏,但它们仍然会跳转。
它确实起作用了,这是最重要的...但最终 ALSA 包装器也起作用了。