如何理解音频子系统?

Phi*_*lip 4 sound pulseaudio alsa

我已经使用了很多 Ubuntu 版本,我从 5.10 开始。但从那以后我就遇到了音频子系统的问题。不管什么硬件,目前我有两台电脑,都有问题。在我的笔记本电脑上,我需要触发扬声器通道来获得声音,在我的桌面上,还有 Ubuntu 10.04/32 位,我也花了很多时间才能使声音正常工作。实际上它只是偶然地起作用。虽然输入的音质还是很差的。

现在我在另一个分区上安装了 Ubuntu 10.04/64 位,尽管高级软件堆栈似乎没问题,但声音不起作用。Pavucontrol 注册声音并显示正确的硬件,但我什么也听不到。(除了在其他输出插孔、前面板和其他通道上,我听到奇怪的声音。)

我的问题是:我怎样才能学会理解 Ubuntu 的声音系统并能够自己调试这些问题?

还有一个问题:为什么 Ubuntu 上的音频如此复杂?在线论坛上肯定有数以万计的主题讨论这些问题,我已经看到数十个主题表明没有成功的解决方案。另一方面,必须有数百个解决问题的指南,但没有一个能够涵盖所有内容......

谢谢,菲利普

Dan*_*hen 8

在我在 Ubuntu 中维护 PC 音频堆栈的任期内,我做了几次关于调试桌面方面的演示,您可能会发现是最温和或信息量最大的一次。问题的要点是,自我(又名“技术骄傲”)、政治和所有权冲突(又名“没有维护者”)的组合导致在过去十年(和几年)中出现了大量 API,并且到处都做出了许多错误的假设。 我们将继续消除许多不一致和糟糕的假设。特别是对于 Ubuntu,我们有一个开发者 Launchpad 小组. 我不能代表其他成员发言,因为他们都是 Canonical 员工,可能有其他限制,但当然可以通过 Launchpad 与我联系;我很高兴在我们的日程安排网格中单独引导您完成调试过程。

务必注意,PulseAudio 对音频硬件有更严格的要求,其方式与传统应用程序完全不同。这些要求继续暴露内核、声音驱动程序和底层库中的错误假设。长期以来,人们对“修复损坏的声音”的“解决方案”包括删除 PulseAudio,它有效地跳过了内核、声音驱动程序和底层库本身的损坏方面。因此,当您“恢复声音”时,问题仍然存在。最后,彻底解决问题要好得多。

总而言之,有两种常规的音频调试方法。要么从应用程序级别开始,例如 Banshee,要么从硬件级别开始。为了保持一致性,我将前者称为“高级”,即在堆栈中较高,而后者称为“低级”,或在最靠近硬件的堆栈中较低。我最习惯从最低级别向上进行故障排除,因为我在过去十年(从创建和维护设备驱动程序到应用程序集成)参与音频工作时看到 OEM 重复了 Linux(即内核)必须解决的错误(或者我们开发人员有时称之为“hack around”)。然而,硬件人员并不比软件人员更内疚。这些问题有很多基础:它没有 无论它们位于 BIOS、电源、主板桥接器、声音控制器和编解码器、内核还是用户空间部分(库、API、PulseAudio、应用程序等)。最后,问题很简单:我们都没有充分处理以下和跨越每个级别的越界情况

在 PC 硬件级别,我们通过准确识别所使用的组件来开始调试。大多数现代桌面音频硬件都有两个重要的信息:PCI 子系统标识符和音频编解码器子系统标识符。您可以通过以下方式找到前者lspci -nv;查找音频子系统代码 0401 ( AC'97 ) 或 0403 ( High Definition Audio )。根据硬件的不同,后者可以通过ALSA驱动程序本身公开的信息来识别/proc/asound(我刚刚链接的开发人员调试脚本自动化了大部分信息收集)。意识到并记住相似甚至相同的症状通常具有不同的硬件和软件原因,这一点绝对重要. 出于这个原因,修复错误的人最容易获得清晰的错误报告,这就是为什么在 Ubuntu 中我们有ubuntu-bug alsa-base驱动程序问题和ubuntu-bug pulseaudio应用程序问题。如果您不确定是什么问题,只需选择一个,或者使用 ubuntu-bug 的音频症状。无论如何,我们会根据需要要求提供其他信息。

PCI SSID 很重要,因为它记录了哪个计算机制造商哪组音频组件集成到主板上。例如,您经常会发现 Dell、HP/Compaq、Acer、Samsung、Lenovo 等使用 IDT/Sigmatel、Realtek、Cirrus、Analog 和 Conexant 音频组件的不同组合。 拥有 Realtek 269 的 Dell 不一定与拥有 Realtek 269 的 HP 具有相同的行为

从音频设备制造商的角度来看,编解码器 SSID 可以被认为是 PCI 的模拟。与编解码器 SSID 相关的信息可用于查找已集成到芯片上的版本。

不幸的是,这就是问题开始的地方。假设 BIOS 没问题(这是一个相当盲目的假设,因为有很多损坏的 BIOS 会对 Linux 音频造成严重破坏),有时 PCI SSID 会被错误地重用。在这些情况下,我们的求助方法是根据编解码器 SSID 在驱动程序中应用特定的怪癖。不幸的是,有时编解码器 SSID 被错误地重用。在这些情况下,除了更盲目地强制尝试重新初始化驱动程序之外,我们还必须查看编解码器的特定修订版。

对于大多数最新设备,我们倾向于信任 BIOS,而不是使用我们历史上“仅使用这种硬编码定义”的方法。在某些情况下,我们必须使用工具来模拟编解码器,以找出哪些引脚定义执行哪些功能。驱动程序中缺少处理插孔感的功能,即在(移除)插入耳机时(取消)使内部扬声器静音,可以通过这种方式轻松纠正

一旦我们确定了您的底层硬件不破,并且不需要声卡驱动程序进行修补,我们看一下用户空间层,即alsa-libalsa-pluginspulseaudio。绝大多数问题在于驱动程序或(某些接口)PulseAudio。

alsa-lib负责处理所有原生 ALSA 操作(因此,PulseAudio 也使用它)。无论是否使用PulseAudio,这里的问题都会表现出来。另一方面,仅在使用“默认”ALSA 虚拟设备时出现的问题可以指向 PulseAudioalsa-lib插件(in alsa-plugins)或 PulseAudio 本身。在标准的 Ubuntu 8.10 和 Kubuntu 10.10 安装中,“默认”路由通过 PulseAudio,因此在“默认”和本机 PulseAudio 输出(或根据用例可能是输入)之间切换应该有助于缩小进一步调查的范围。