我已经使用过很多版本的 Ubuntu,从 5.10 开始。但从那时起,我的音频子系统就出现了问题。无论什么硬件,目前我有两台电脑,两台电脑都出现了问题。在我的笔记本电脑上,我需要触发扬声器通道才能获得声音,在我的台式机上,同样是 Ubuntu 10.04/32 位,我也花了很多功夫才让声音正常工作。实际上,它只是偶然起作用了。尽管输入声音质量仍然很差。
现在我在另一个分区上安装了 Ubuntu 10.04/64bit,声音无法正常工作,尽管高级软件堆栈似乎没有问题。Pavucontrol 记录了声音并显示了正确的硬件,但我什么也听不到。(除了在其他输出插孔、前面板和其他通道上,我听到了奇怪的声音。)
我的问题是:我如何才能学会了解 Ubuntu 的声音系统并能够自己调试此类问题?
还有一个问题:为什么 Ubuntu 上的音频如此复杂?在线论坛上肯定有数万个关于这些问题的帖子,我已经看到数十个帖子表明没有成功的解决方案。另一方面,肯定有数百个解决问题的指南,但这些都无法涵盖所有内容……
谢谢,菲利普
答案1
在我负责维护 Ubuntu 的 PC 音频堆栈期间,我关于桌面方面调试的几个演示,你可能会发现这个最温和或最有信息量的。事情的要点是,自我意识(又名“技术自豪感”)、政治和所有权冲突(又名“没有维护者”)的结合导致过去十年(和几年)出现了大量 API,并且到处都出现了许多错误的假设。 我们正在继续消除许多不一致之处和错误的假设. 针对 Ubuntu,我们有一个开发者 Launchpad 小组。我不能代表其他成员发言,因为他们都是 Canonical 员工,可能有额外的限制,但当然可以通过 Launchpad 随时联系我;由于我们的日程安排相吻合,我很乐意单独指导您完成调试过程。
必须注意的是PulseAudio 对音频硬件的要求更为严格,与传统应用程序有着根本的不同。这些要求继续暴露出内核、声音驱动程序和底层库中的错误假设。长期以来,人们“修复损坏的声音”的“解决方案”是删除 PulseAudio,这实际上跳过了内核、声音驱动程序和底层库本身的损坏方面。因此,虽然您“恢复了声音”,但问题仍然存在。最终,最好彻底解决问题。
总而言之,有两种常规音频调试方法。一种是从应用程序级别开始,例如 Banshee,另一种是从硬件级别开始。为了保持一致性,我将前者称为“高级”,即堆栈中较高的位置,而将后者称为“低级”,即堆栈中靠近硬件的较低位置。我最习惯从最低级别向上进行故障排除,因为我过去十年来一直从事音频工作(从创建和维护设备驱动程序到应用程序集成),看到 OEM 重复犯下 Linux(即内核)必须解决的错误(或者我们开发人员有时称之为“绕过”)。然而,硬件人员并不比软件人员更有罪。这些问题有很多基础:无论它们是位于 BIOS、电源、主板桥、声音控制器和编解码器、内核还是用户空间部分(库、API、PulseAudio、应用程序等)。最后,问题很简单:我们都无法充分处理来自上下各级的越界情况。
在 PC 硬件层面,我们开始调试准确识别使用哪些组件。大多数现代桌面音频硬件都有两条重要信息:PCI 子系统标识符和音频编解码器子系统标识符。您可以通过以下方式找到前者lspci -nv
;查找音频子系统代码 0401 (1997 年) 或 0403 (高清音频)。根据硬件的不同,后者可以通过暴露的信息来识别阿尔萨斯大学驱动程序本身/proc/asound
(我刚刚链接的开发人员调试脚本自动完成大部分信息收集)。意识到并记住这一点至关重要类似甚至相同的症状通常由不同的硬件和软件原因造成。因此,修复错误的人最好有一份清晰的错误报告,这也是为什么我们在 Ubuntu 中ubuntu-bug alsa-base
为驱动程序问题和ubuntu-bug pulseaudio
应用程序问题提供报告的原因。如果您不确定问题出在哪里,只需选择一个,或使用 ubuntu-bug 的音频症状。无论如何,我们会根据需要请求更多信息。
PCI SSID 很重要,因为它记录了计算机制造商整合主板上安装哪组音频组件。例如,您经常会发现戴尔、惠普/康柏、宏碁、三星、联想等使用 IDT/Sigmatel、Realtek、Cirrus、Analog 和 Conexant 音频组件的不同组合。 具有 Realtek 269 的戴尔不一定具有与具有 Realtek 269 的 HP 相同的行为。
从音频设备制造商的角度来看,编解码器 SSID 可以视为 PCI 的模拟。与编解码器 SSID 相关的信息可用于查找已集成到硅片上的修订版本。
不幸的是,问题就出在这里。假设 BIOS 没有问题(这是一个相当盲目的假设,因为有很多损坏的 BIOS 会严重破坏 Linux 音频),有时 PCI SSID 会被错误地重用。在这种情况下,我们的补救措施是根据编解码器 SSID 在驱动程序中应用特定的怪癖。不幸的是,有时编解码器 SSID 会被错误地重用。在这种情况下,除了盲目地暴力尝试重新初始化驱动程序之外,我们还必须查看编解码器的特定修订版本。
对于大多数最新设备,我们倾向于信任 BIOS,而不是使用我们过去“只使用这种硬编码定义”的方法。在某些情况下,我们必须使用工具来模拟编解码器,以找出哪些引脚定义执行哪些功能。驱动程序中缺少处理插孔感知的功能,即在插入(移除)耳机时(取消)静音内置扬声器,可以轻松纠正以这种方式。
一旦我们确定您的底层硬件没有损坏,并且声音驱动程序不需要修补,我们就会查看用户空间层,即alsa-lib
、alsa-plugins
和pulseaudio
。绝大多数问题都出在驱动程序或 PulseAudio(某些接口)上。
alsa-lib
负责处理所有本机 ALSA 操作(因此,PulseAudio 也使用它)。无论是否使用 PulseAudio,此处的问题都会显现出来。另一方面,只有在使用“默认”ALSA 虚拟设备时出现的问题才可能指向 PulseAudio 插件alsa-lib
(在 中alsa-plugins
)或 PulseAudio 本身。在标准 Ubuntu 8.10 和 Kubuntu 10.10 安装中,“默认”通过 PulseAudio 路由,因此在“默认”和本机 PulseAudio 输出(或根据用例而定的输入)之间切换应该有助于缩小要进一步调查的层的范围。
答案2
你可能想从脉冲音频进入ubuntu 的维基。