Linux 音频故障排除,第 2 部分

作者:Dave Phillips

在本系列的上一篇文章中,我介绍了各种基于 GUI 的工具,它们可以帮助您更多地了解您的系统,从而帮助识别潜在的麻烦组件。本周,我们将看看一些执行类似工作的命令行实用程序。事实上,其中一些实用程序是更具吸引力的 GUI 工具背后的引擎,并且可能有充分的理由直接使用这些引擎,而不是依赖于它们图形化的化身。

Linux 控制台或终端窗口(xterm 或类似工具)是您开始音频诊断的最佳助手。如果您从命令提示符启动应用程序,您可以收到来自程序的关于其初始化和性能的报告,并且错误通常会报告有用的详细信息。

Linux 命令行工具是强大的资源。它们通常旨在组合使用,遵循 UNIX 的小工具哲学,这些小工具可以链接在一起以创建更强大的工具。以下文章描述了一些用于排除音频问题的重要工具和实用程序,但我的描述在此必然是简短的。有关特定命令的更完整信息,请参阅其手册页(例如“man dmesg”)。

警告:以下内容可能包含极其 Geek 的文本,其中包含晦涩的术语、令人麻木的技术细节以及(惊呼)在命令提示符下输入的命令和程序。请自行承担风险。您已被警告。

通用系统分析

用户对他的机器的机械细节一无所知是很常见的。幸运的是,Linux 提供了各种系统分析工具。以下是我多年来发现最有帮助的一些工具。

当 Linux 启动时,它会以纯文本形式向其标准输出设备(即您的显示器)发送一系列消息。这些消息列出了系统在识别您的机器及其组件方面的成功和失败,以及在配置这些组件以供使用方面的成功和失败。报告滚动得太快,无法在机器启动时阅读,但幸运的是,Linux 提供了 dmesg 命令来回忆这些报告。

由于它仅报告状态,因此任何普通用户都可以运行 dmesg。唉,当不加修改地运行时,dmesg 将像启动期间一样快速地流式传输其报告。如果能够悠闲地滚动浏览此输出会更好,而且令人高兴的是,有一种简单的方法可以通过管道将 dmesg 传递给 less 命令来实现。考虑以下命令组合

	dmesg | less

此摘录显示了此命令生成的报告的一部分

dlphilp@The3800:~> dmesg |less
...
hda: SONY CD-RW CRX225E, ATAPI CD/DVD-ROM drive
hdb: LITE-ON COMBO SOHC-5236K, ATAPI CD/DVD-ROM drive
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
Probing IDE interface ide1...
libata version 2.00 loaded.
sata_nv 0000:00:0e.0: version 2.0
ACPI: PCI Interrupt Link [APSI] enabled at IRQ 23
ACPI: PCI Interrupt 0000:00:0e.0[A] -> Link [APSI] -> GSI 23 (level, low) -> IRQ 16
PCI: Setting latency timer of device 0000:00:0e.0 to 64
[lines 278-286] 

管道符号(| 字符)将 dmesg 输出发送到 less 命令,从而使用户能够前后滚动浏览文本。如果您想稍后阅读输出,只需使用 Linux 重定向符号(> 字符)将 dmesg 输出发送到文本文件

	dmesg > dmesg-report.txt

您可以通过将 dmesg 输出通过管道传输到 grep(一种模式匹配实用程序)来进一步优化您的搜索。以下示例在 dmesg 报告中搜索与指示模式匹配的文本字符串

	dmesg | grep USB

该示例在我的 JAD 盒子上生成了此报告

dlphilp@The3800:~> dmesg |grep USB
ohci_hcd: 2006 August 04 USB 1.1 'Open' Host Controller (OHCI) Driver (PCI)
ohci_hcd 0000:00:0b.0: new USB bus registered, assigned bus number 1
hub 1-0:1.0: USB hub found
ehci_hcd 0000:00:0b.1: new USB bus registered, assigned bus number 2
ehci_hcd 0000:00:0b.1: USB 2.0 started, EHCI 1.00, driver 10 Dec 2004
hub 2-0:1.0: USB hub found
usb 1-1: new low speed USB device using ohci_hcd and address 2
input: Logitech USB-PS/2 Optical Mouse as /class/input/input2
input: USB HID v1.10 Mouse [Logitech USB-PS/2 Optical Mouse] on usb-0000:00:0b.0-1
drivers/usb/input/hid-core.c: v2.6:USB HID core driver

管道和重定向是有用的机制,我们将在其他命令行工具中使用它们,但让我们首先看看其他一些分析工具。

uname 命令提供了关于您的内核、CPU 类型、网络节点 ID 等信息的简洁摘要(有关 uname 的标志和功能的完整描述,请参见手册页)。当使用 -a 开关运行时,您将收到该命令的完整报告

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

这是该信息的分解

  • Linux - 内核名称
  • The3800 - 网络主机名
  • 2.6.19-5-rt - 内核版本
  • SMP PREEMPT - 内核版本
  • i686 - 机器名称
  • athlon - CPU 类型
  • i386 - 硬件平台
  • GNU/Linux - 操作系统

如果您在邮件列表或论坛上寻求帮助,您很可能会被问及这些详细信息。uname 命令将为您揭示它们。

Linux 采用名为 proc(进程)文件系统的虚拟文件系统。我们可以通过使用 cat 命令从 proc 系统读取各种状态报告。以下示例查询 asound 目录(由 proc 监视的 ALSA 系统),并告诉我我的机器中安装了多少声卡

	cat /proc/asound/cards

这是我的 JAD 盒子上的报告

0 [Live           ]: EMU10K1 - SBLive! Value [CT4832]
                     SBLive! Value [CT4832] (rev.8, serial:0x80271102) at 0xa000, irq 20
1 [VirMIDI        ]: VirMIDI - VirMIDI
                     Virtual MIDI Card 1

请注意,在此报告中可以找到许多相关信息,包括卡编号和命名、其硬件版本及其 IRQ 编号。同样,在进行故障排除时,您可能需要知道这些名称和值。

cat/proc 组合非常强大。您可以通过在输入此命令后按 Tab 键来查看整个 proc 文件系统的列表

	cat /proc/[tab]

对文件系统中的任何目录执行相同的操作,以查看 proc 还监视了哪些内容

	cat /proc/asound/[tab]

该命令为我的 JAD 机器返回此列表

Live/    card1/   hwdep    pcm      version  
VirMIDI/ cards    modules  seq/     
card0/   devices  oss/     timers

与之前一样,然后我可以运行“cat /proc/asound/whatever”以获取有关我的 ALSA 组件的更详细信息。因此,如果我需要知道我的 ALSA 版本,我只需运行此命令

dlphilp@The3800:~> cat /proc/asound/version 
Advanced Linux Sound Architecture Driver Version 1.0.13 (Tue Nov 28 14:07:24 2006 UTC). 

以下列表提供了 cat/proc 组合的其他调用,这些调用在故障排除会话期间可能会有所帮助

	cat /proc/interrupts
	cat /proc/cpuinfo
	cat /proc/devices

有关这些命令以及如何使用它们的更详细信息,请参阅 cat 和 proc 的手册页。请记住,即使您不理解这些工具的输出,也可能会有人要求您提供信息,他们理解这些信息并可以帮助您解决困难。这让我想到了题外话...

在寻求 Linux 音频问题方面的帮助时,了解一些关于 Linux 开发人员和高级用户的事情并非坏事。在大多数情况下,他们很乐意提供帮助,但他们会提出一些近乎难以理解的问题,特别是对于非技术用户而言。学习使用建议的工具,保持耐心和礼貌。尽可能完整地提供请求的报告,并且如果没有任何简单的答案也不要感到惊讶。Linux 音频问题可能难以诊断和解决,但如果您坚持下去,您会发现您的帮助者通常会一直与您在一起,直到您的问题得到解决。在这个领域,就像在许多其他领域一样,“坚持不懈必有回报”是明智之言。

利用总线

声音设备通常位于所谓的总线线路中。常见的总线线路包括您机器的 PCI 卡插槽、USB 和 FireWire 端口以及 PCMCIA 插槽。音频硬件可用于这些位置中的任何一个,并且每个位置都有其自身的性能特性。

lspcilsusb 命令列出了 PCI 和 USB 总线上存在的设备。当使用 -v 开关调用时,它们会返回详细报告,但您可以再次组合工具来过滤、限制和重定向它们的输出。在下一个示例中,命令链只是将来自 lspci 的详细输出重定向到文本文件

	lspci -v > foo.txt

与我们之前所做的一样,如果您不需要保存输出,您可以改为将输出通过管道传输到 less。

下一个链过滤来自 lspci 的输出,并将过滤后的报告发送到文本文件

	lspci -v | grep Creative > foo.txt

没有重定向的输出

dlphilp@The3800:~> lspci -v | grep Creative
01:07.0 Multimedia audio controller: Creative Labs SB Live! EMU10k1 (rev 08)
        Subsystem: Creative Labs CT4832 SBLive! Value
01:07.1 Input device controller: Creative Labs SB Live! Game Port (rev 08)
        Subsystem: Creative Labs Gameport Joystick

lsusb 的使用类似。这两个命令都有许多开关来修改输出,并且坚定的故障排除人员最好查阅它们的手册页以获取更多详细信息。

模块

您的 Linux 盒子中的声卡之所以工作,是因为有一个 ALSA 驱动程序模块管理您的硬件和计算机操作系统之间的最低级别通信。如果没有驱动程序,或者驱动程序出现问题,那么声卡可能也就没用了。

lsmod 命令列出了当前加载到您系统中的模块。该命令不带开关,因此我们之前的过滤器将派上用场。以下是一些有用的 lsmod 调用

	lsmod > modules.txt
	lsmod | grep snd   (all ALSA modules)
	lsmod | grep usb   (all USB device modules)
	lsmod | grep ieee1394   (FireWire driver)

如果您知道您有硬件但未列出驱动程序,则可能是驱动程序模块本身不存在,或者您的系统在硬件配置阶段未能加载它。您可以使用 modprobe 手动加载或卸载模块,但您需要知道驱动程序的名称。如果您的声卡或芯片组在 ALSA 声卡矩阵上列出,您可以找到与您的声卡一起列出的驱动程序模块的名称。对于我的 SBLive,我将输入以下命令字符串

	modprobe -i snd-emu10k1

请注意,您必须具有 root 用户权限才能安装设备驱动程序。

ALSA 驱动程序模块可能包含各种选项,这些选项可能会严重影响设备的性能。modinfo 命令返回有关模块的信息,包括其可选参数,如有关 SBLive 驱动程序模块的此输出中所示

dlphilp@The3800:~> modinfo snd-emu10k1
filename:       /lib/modules/2.6.19-5-rt/kernel/sound/pci/emu10k1/snd-emu10k1.ko
author:         Jaroslav Kysela 
description:    EMU10K1
license:        GPL
vermagic:       2.6.19-5-rt SMP preempt mod_unload 586 REGPARM 
depends:        snd-pcm,snd-util-mem,snd-page-alloc,snd,snd-rawmidi,snd-timer,snd-hwdep,snd-ac97-codec,snd-seq-device
alias:          pci:v00001102d00000002sv*sd*bc*sc*i*
alias:          pci:v00001102d00000004sv*sd*bc*sc*i*
alias:          pci:v00001102d00000008sv*sd*bc*sc*i*
srcversion:     17D45264B5978A64D57C5B7
parm:           subsystem:Force card subsystem model. (array of uint)
parm:           enable_ir:Enable IR. (array of bool)
parm:           max_buffer_size:Maximum sample buffer size in MB. (array of int)
parm:           max_synth_voices:Maximum number of voices for WaveTable. (array of int)
parm:           seq_ports:Allocated sequencer ports for internal synthesizer. (array of int)
parm:           extout:Available external outputs for FX8010. Zero=default. (array of int)
parm:           extin:Available external inputs for FX8010. Zero=default. (array of int)
parm:           enable:Enable the EMU10K1 soundcard. (array of bool)
parm:           id:ID string for the EMU10K1 soundcard. (array of charp)
parm:           index:Index value for the EMU10K1 soundcard. (array of int)

如果您需要为未分配的参数分配值,您可以将其添加到 modprobe 的模块调用中,或者您可以将其永久添加到 /etc/modprobe.d/sound 中。例如,为了限制 EMU10k1 上的合成器声音数量,我将在 /etc/modprobe.d/sound 中添加以下行

	options snd-emu10k1 max_synth_voices=16 

请注意,sounds 文件的确切名称和位置可能因系统而异。也可能需要在 /etc/modprobe.d/alsa-base 中添加请求的选项。有关添加模块选项的更多具体详细信息,请参阅您发行版的文档。

库依赖项

让我们回到应用程序级别。如果程序根本无法打开,请使用 ldd 命令查看其库依赖项是否已满足。此缩写报告检查 FST 二进制文件

dlphilp@The3800:~/fst-1.8> ldd fst.exe.so 
        linux-gate.so.1 =>  (0xffffe000)
        libgtk-x11-2.0.so.0 => /opt/gnome/lib/libgtk-x11-2.0.so.0 (0xb7bd4000)
        libgdk-x11-2.0.so.0 => /opt/gnome/lib/libgdk-x11-2.0.so.0 (0xb7b52000)
        ...
        libjack.so.0 => /usr/lib/libjack.so.0 (0xb76fe000)
        librt.so.1 => /lib/librt.so.1 (0xb76f5000)
        libasound.so.2 => /usr/lib/libasound.so.2 (0xb7641000)
        liblash.so.1 => /usr/lib/liblash.so.1 (0xb7636000)
        libwine.so.1 => /usr/local/lib/libwine.so.1 (0xb761a000)
        ... 

如果某个条目被列为未找到,则您缺少所需的依赖项。此时,您可以使用系统的软件包管理器来查找并安装缺少的组件。

ALSA 工具

ALSA 附带了一些方便的实用程序,例如

  • alsaconfig - 声卡安装/配置实用程序
  • amixer/alsamixer - 软件声卡混音器实用程序
  • alsactl - 存储和调用混音器设置

这些工具都是简单的应用程序。Alsaconfig 和 alsamixer 具有字符图形界面,并且不言自明。amixer 命令报告具有大量详细信息的混音器元素值;有关分隔其输出的有用开关列表,请参阅其手册页。alsactl 实用程序采用两个命令选项之一(store/restore),并且必须以 root 权限运行。

请帮助

您的发行版文档可能包含有关硬件故障或顽固软件包的有用详细信息,但在某些时候您可能会发现自己需要更多帮助。如果您的问题是特定于应用程序的,您应该查找专门的 Wiki 或论坛,如果搜索功能可用,您可以查找以前对您的问题的提及。Linux 音频开发者Linux 音频用户 组的列表存档包含大量与系统分析、诊断和修复相关的主题,ALSA 站点和 非官方 ALSA Wiki 同样是有价值的资源,当您寻找具有先前经验的用户时,Google 可以成为天赐之物。

Linux 音乐制作者

好的,是时候摆脱这些螺丝和螺母的东西了,但不幸的是,我一直忙于其他事情,有一段时间没有听音乐了。您只需跳到 Hans Fugal 的 LAM 并查看一些最新的列表。

结尾

在我的下一篇文章中,我将总结这个故障排除系列,其中列出了常见问题及其典型解决方案(当然,使用此处遇到的工具和程序)。再次,我鼓励读者发送他们自己的技巧和技术报告,并且我欢迎就我应该考虑添加到我的 Linux 音频修复工具包中的其他工具和实用程序提出建议。

加载 Disqus 评论