Linux 音频故障排除,第 3a 部分

作者:Dave Phillips

最终,我们来到了本系列的最后一期,问答环节,我们将在此探讨 Linux 上音频和 MIDI 常见的一些问题,以及这些问题的一些常见和可能不太常见的解决方案。我们已经了解了一些 Linux 系统故障排除工具包中不可或缺的项目,现在让我们看看如何应用它们。

我们首先列出一些最常听到的抱怨,然后我们将继续介绍一些额外的技巧和一般建议。我将在本系列的结尾处附上关于 Studio Dave 的系统配置的一些说明。

如果/那么:问题与解决方法

Linux 音频问题可能发生在以下任何阶段

  • 硬件 - 物理连接、电源状态
  • 声卡 - ALSA 驱动程序和配置
  • 软件 - 虚拟连接、JACK 状态

在这些点出现问题很可能会导致音频故障。

以下“抱怨列表”当然是不完整的。随着 Linux 本身的发展,新的问题会不断出现,但这里列出的难题代表了我在订阅的各种邮件列表和论坛上最常遇到的投诉。我鼓励读者发送他们自己的例子来添加到列表中。

如果: “我的声卡不发出任何声音。”

那么: 确保您的音频硬件受您的声音系统支持。查看 ALSA 声卡矩阵,看看您的声卡或芯片组是否在列表中。如果不在,则您的声卡可能不受支持,您将需要购买不同的设备。如果您知道您的硬件受支持,请仔细检查与设备的所有连接。确保所有电缆都是完整的,并且所有连接都牢固。检查电源,并确保所有放大器、扬声器和混音器都已通电并正确连接。确保已建立正确的连接:如果您的吉他插入的是扬声器输出插孔而不是线路输入,那么调整其他所有内容都将徒劳无功。

如果硬件已正确安装和连接,则现在是检查 ALSA 阶段的时候了。使用以下命令查看您的机器上实际安装了什么

	cat /proc/asound/cards

这是我的 JAD 盒子上该命令的输出结果

dlphilp@The3800:~> cat /proc/asound/cards
 0 [Live           ]: EMU10K1 - SBLive! Value [CT4832]
                      SBLive! Value [CT4832] (rev.8, serial:0x80271102) at 0xa000, irq 22
 1 [VirMIDI        ]: VirMIDI - VirMIDI
                      Virtual MIDI Card 1

如果没有任何报告,并且您确定您的设备受 ALSA 支持,请运行 alsaconf 实用程序(以 root 用户身份)来配置和安装适用于您的声卡的正确设备驱动程序。安装驱动程序后,您将需要调整声卡混音器输出电平。打开终端窗口并运行 alsamixer 或任何类似的混音器实用程序。将主输出和 PCM 通道设置为其全输出的约 75%,然后使用诸如 ALSA 的 aplay 或优秀的 AlsaPlayer 等程序播放 WAV、OGG 或 MP3 文件。如果文件播放没有问题,请运行 alsactl 程序(再次以 root 身份)来永久存储您的混音器通道设置

	alsactl store

需要固件的设备可能需要特定版本的固件才能在 Linux 下工作。可能会发生您的设备受支持,但其固件版本不受支持的情况。此信息应该可以从 ALSA 网站获得,但您可能还需要在 Linux 音频邮件列表之一中询问。

还要检查软件连接。如果您正在使用 JACK,请确保 I/O 端口已正确连接。您的播放或处理链中的最后一个设备必须连接到 alsa_pcm 输出端口,否则音频信号将永远无法到达您的扬声器。在典型情况下,您将使用 QJackCtl 或类似程序来建立您的 JACK I/O 连接,但某些程序(例如 Csound5)提供了与外部世界连接的内部机制。确保您的应用程序已正确配置为与 JACK 一起运行(即,选择了正确的输入/输出端口)。

如果您仍然没有声音(在仔细检查了到目前为止采取的所有步骤之后),那么现在是寻求帮助的时候了。搜索 Linux 音频用户Linux 音频开发者 邮件列表的存档。您可能还需要查看 ALSA 列表存档(并且最好加入这些列表)。搜索 Google,从诸如“sblive problem linux”之类的字符串开始,并随着您的进行缩小搜索词(例如“sblive irq problem 64studio”)。

如果 Google 和存档都无法提供帮助,您将需要在列表和任何其他可用的通信线路(包括相关论坛、维基和 IRC 频道)上直接提问。在这个阶段,您应该准备好回答一些技术问题,因此请将本系列的前两部分放在手边。Linux 音频大师通常非常愿意帮助即使是最新的新手,但他们只能在您提供相关的有用信息的范围内提供帮助。您将被要求提供诸如 lspcilsmod 等命令的输出,但如果您对这些报告的含义知之甚少或一无所知,请不要担心。大师们知道,他们需要这些信息来帮助您解决问题。至少要确保您知道您的声卡或音频芯片组的名称。您还应该使用上面显示的 cat 命令字符串运行基本诊断。

最重要的是,要有耐心和礼貌。大师和巫师是不可预测的生命形式,我们必须以谦卑的诚意接近他们。实际上,我的大多数联系人都很愉快并且乐于助人,但是当我完成了初步功课时,他们总是最有帮助的。请记住,他们也很忙,并且他们经常忙于改进您可能正在抱怨的软件,因此当您寻求帮助时,请好好说话。

如果: “我能听到声音,但每当我播放声音文件时,声音都会断断续续。”

那么: 这个问题通常发生在 IRQ 冲突时。您的声音设备需要一个未被占用的 IRQ 线路(也称为中断),否则共享中断的设备在请求其服务时会发生冲突。实际上,设备可以成功共享一个 IRQ 地址,但在任何时候共享设备都不应同时运行。

对于这个问题,您没有太多可能的解决方案。许多现代机器都包含用户可编程的 IRQ 分配(APIC:可分配可编程中断控制器),但是如果软件解决方案失败,您可能需要将您的声卡从当前插槽中取出并将其放入另一个插槽(即 IRQ 地址在主板上是硬连线的)。

使用此命令确定哪些设备正在使用哪些中断

	cat /proc/interrupts

在我的 JAD 盒子上,我收到这份报告

dlphilp@The3800:~> cat /proc/interrupts 
           CPU0       
  0:     361910   IO-APIC-edge      timer
  1:      24389   IO-APIC-edge      i8042
  7:          0   IO-APIC-edge      parport0
  8:          2   IO-APIC-edge      rtc
  9:          0   IO-APIC-fasteoi   acpi
 12:          4   IO-APIC-edge      i8042
 14:      76035   IO-APIC-edge      ide0
 16:     696033   IO-APIC-fasteoi   libata, eth0
 17:          0   IO-APIC-fasteoi   libata
 18:          2   IO-APIC-fasteoi   ehci_hcd:usb1
 19:       3316   IO-APIC-fasteoi   ohci_hcd:usb2
 20:          3   IO-APIC-fasteoi   ohci1394
 21:     586617   IO-APIC-fasteoi   nvidia
 22:          0   IO-APIC-fasteoi   EMU10K1

如您所见,我的 SBLive 确实位于 IRQ 22 上,这也在之前使用 cat 命令时报告过。如果在该地址列出了两个设备,那么我将不得不移动或以其他方式将我的设备重新分配到新的 IRQ 位置。

最佳中断分配可能有点棘手,但超级大师 Mark Knecht 准备了一些说明 IRQ 冲突的分析和纠正 的笔记。此信息特别有用

以下是非 APIC 机器上的中断优先级顺序

0, 1, 8, 9, 10, 11, 12, 13, 14, 15, 3, 4, 5, 6, 7

0 是最高优先级


7 是最低优先级

在大多数主板上,中断 9、10、11、3、4、5、6、7 可能会提供给 PCI 插槽。您必须查看您的特定主板才能知道哪些是可用的。许多较新的主板允许您在主板的 BIOS 中更改 PCI 接口的 IRQ 设置。这对于 USB 设备也很有用,因为 USB IRQ 通常会与其中一个 PCI 插槽一起标记。因此,您可以通过调整 PCI 插槽的 BIOS 设置来更改 USB 卡的 IRQ。如果您无法在 BIOS 中调整设置,则另一个选择是打开您的机器并在可用插槽中移动卡。

根据我的经验,所有声卡都希望位于 IRQ 9、10 或 11 上。卡位于哪个 IRQ 上实际上并不那么重要,但重要的是哪些设备位于较高的 IRQ 上。例如,如果您的声卡位于 IRQ 11 上,并且 IRQ 9 或 10 上没有任何东西,那么就没问题。但是,如果您在 IRQ 9 上插入 PCI 图形适配器,您的声卡可能会开始出现问题,因为图形适配器将具有更高的性能优先级。假设任何具有较高优先级编号的设备都会妨碍具有较低优先级的设备。

关于非 APIC 的最后一件事:中断可能是共享的。仅仅因为您的声卡位于 IRQ 9 上并不意味着另一个设备没有共享 IRQ 9。在这种情况下重要的是另一个设备将要生成多少中断,以及它的驱动程序编写得如何。

Mark 的笔记适用于 APIC 和非 APIC 机器。APIC 架构为系统添加了更多中断,以及可编程分配。有关该主题的更多信息,请参阅 Clement Ladisch 关于 设置 Linux 中断优先级 的页面。

如果系统声音守护程序(如 KDE 的 artsd 或 GNOME 的 esd)与 JACK 音频服务器同时安装和运行,也可能发生音频断断续续的情况。删除或禁用守护程序以消除问题。

如果: “我能听到声音,但声音有噪音。”

那么: 静音所有混音器通道,除了主音量输出和 PCM 通道。如果噪音消失,请逐个提高通道电平,以确定哪些通道有噪音。例如,我的 SoundBlaster PCI128 上的 CD 和麦克风通道在不使用时必须静音,否则它们会产生可听到的并且非常烦人的嘶嘶声。为了获得最佳效果,请始终静音不使用的混音器通道,尤其是在录音时。另请注意,仅仅将电平降至零可能无法完全消除通道噪音。静音那些不使用的通道,这是一个值得遵循的好规则。

电缆质量绝对会产生影响。避免使用廉价的非屏蔽模制端塑料电缆,并使用优质连接器。松动的插头可能会导致静电噪音和音频掉线,并且消费级声卡上的插孔通常不是高质量的连接器,因此您应确保与声卡的所有连接都牢固,没有“晃动”。如有必要,购买更好的连接器(我使用 Radio Shack 的镀金适配器)。

唉,计算机本质上是嘈杂的设备。除了来自风扇和驱动器的可听声音外,您的机器还会产生 RFI(射频干扰)噪声,这些噪声可能会被诸如声卡之类的敏感设备拾取。专业音频板通过屏蔽板硬件和提供外部接线盒来容纳 RFI 敏感的 ADC/DAC 转换器来解决此问题。消费级声卡更容易受到噪声污染,如果问题足够严重,您可能需要购买更好的声卡或更好的主板。我在为我的台式机购买主板时考虑了这个问题,并且在阅读了其他音频爱好者的在线推荐后,我选择了 技嘉 的基于 AMD64 的主板。

关于噪声源的进一步说明:我有一台非常好的 HP Deskjet 6540 打印机连接到我的 64Studio 盒子,它是一个很棒的设备。唉,当 USB 电缆插入打印机时,它会在我的扬声器中产生细微的尖叫声,只有当电缆从打印机上拔下时才会消失。即使关闭打印机也无法完全消除噪音,它只是改变了频率。幸运的是,噪音不会影响我的录音,它只在播放期间发生,并且完全拔下电缆可以消除它。

如果: “我正在使用 JACK,并且它会定期发出噼啪声。”

那么: 确保 JACK 的采样率设置为适合您的声卡和用途的最佳值。SBLive 用户应注意,他们的声卡被硬连线为以 48 kHz 而不是 CD 标准 44.1 kHz 录音,因此 JACK 的采样率应设置为 48 kHz。如果问题仍然存在,请联系 JACK 开发人员。这个问题是众所周知的,并且通常是采样率不匹配的结果。

如果: “JACK 报告过多的 xrun。”

那么: 在 JACK 术语中,xrun 是音频数据流中的中断。根据情况和您的硬件,一两个 xrun 可能是可以忽略的,但超过几个通常表明您的系统中的某些配置严重错误。xrun 问题的两个最常见的解决方案是:1) 您的 Linux 内核未针对实时性能进行优化,或者 2) 您的 JACK 设置不正确。

关于 Linux 内核,我将直奔主题:在我看来,如今普通用户几乎没有理由去折腾构建和安装 Linux 内核,特别是如果内核是为特定目的(例如数字音频工作站)构建的。我们现在有这么多优秀的实时优化发行版可用,其中所有(或至少大部分)的辛苦工作都已由经验丰富的开发人员为您完成,并且着手配置和安装专门定制的内核根本没有多大意义。并不是说构建内核是如此困难,它只是变得不必要了。此外,低延迟系统不仅仅是一个优化的内核,它还包括许多其他配置选项,这些选项对于普通用户来说可能是显而易见的,也可能不是。

顺便说一句,如果您不知道您现有的内核是否启用了实时功能,您可以使用 uname 命令来查找。这是它关于我的 JAD 盒子的说法

dlphilp@The3800:~> uname -a
Linux The3800 2.6.19-5-rt #1 SMP PREEMPT Sat Nov 25 18:35:39 UTC 2006 i686 athlon i386 GNU/Linux

这里重要的项目是内核版本号 2.6.19-5-rt。“rt”表示此内核(版本 2.6.19)已使用实时优化进行编译。如果 uname 报告的内核没有 rt 扩展名,那么您很可能正在运行可能不太适合 JACK 的内核。如果是这种情况,我强烈建议安装多媒体优化的发行版之一。否则,您必须自己配置和安装优化的内核(有关构建您自己的实时内核的信息,请参阅 低延迟 HOWTO)。

图 1:JACK 中的保守设置


JACK 本身有多种设置会影响实时性能,您可以从图 1 中看到的 QJackCtl 设置屏幕截图中的“参数”面板中看出。显然,应选中“实时”选项,特别是如果您正在使用启用实时的内核。这些设置也会影响实时性能

  • 帧率/周期大小 - 较低的值会降低延迟,但可能会增加 xrun。
  • 采样率 - 设置为声卡和项目要求的最佳值。
  • 周期/缓冲区 - 通常设置为 2,但可能需要针对某些芯片组进行调整。
  • 双工/单工操作 - 双工(同步输入/输出)需要更多 CPU。

如果: “DVD 播放期间的音频不平衡。”

那么: 检查您的媒体音频输出配置。如果设置为 5.1 或其他多声道输出,那么您必须拥有相应的硬件,否则某些音频通道将无法清晰地听到(或根本听不到)。检查您的播放器的音频首选项,将其设置为与您的硬件功能相对应。

如果: “当我重新启动机器时,我的混音器电平消失了。”

那么: 将您的混音器通道设置为所需的电平,然后运行 alsactl store。请记住,您必须以 root 权限运行该命令,否则设置将不会被写入。如果问题仍然存在,请联系 ALSA 开发人员。

如果: “WINE 中的音频延迟非常糟糕。”

那么: 您至少有两种可能的解决方案。您可以购买更快的机器(WINE 似乎偏爱快速硬件)和/或您可以使用 wineasio 驱动程序。如果您选择 wineasio 解决方案,请确保其采样率与 JACK 中的值匹配。

Linux 音频故障排除,第 3 部分的问答环节到此结束。由于空间限制,我必须拆分这一部分,因此我将在下一篇文章中介绍一些 MIDI 故障排除策略以及一些最终的评论和意见。

加载 Disqus 评论