8. 声音

8.1. 哪种声卡最好?

我所说的“最好”是指最适合游戏的。游戏玩家希望我们的游戏能有高质量的声音,并且尽可能少地进行调整。另一方面,音乐家对“最好的声卡”会有非常不同的概念。如果您是音乐家,您可能想查看Linux 音频质量 HOWTO

现在 Linux 已经开始成熟,这个问题不像过去那么重要了。曾几何时,没有板载 MIDI 芯片的声卡(大多数 PCI 声卡)不能进行 MIDI 处理。这主要是像 xdoom 或 lxdoom 这样使用 musserv 的程序的问题。现在我们有了像 Timidity 这样的 MIDI 模拟器和像 SDL 这样的库,它们不需要硬件 MIDI 支持。坦率地说,我用过很多声卡,但就游戏而言,我无法分辨出它们之间的区别。如果您想做诸如将黑胶唱片转换为数字格式之类的事情,那么选择具有专业级 A/D 转换器的声卡绝对至关重要。对于本 HOWTO,我们假设您更像是一个游戏玩家,而不是录音棚工程师。

您的决定应该基于哪种卡最容易配置。如果您已经有一张卡并且运行良好,那就足够了。如果您正打算购买声卡,请购买那种可以快速配置好的声卡。PCI 卡比 ISA 卡更容易处理,因为您不需要告诉它们的驱动程序要使用哪些系统资源(IRQ、DMA、I/O 地址)。有些 ISA 卡是即插即用的,例如 Creative AWE-64,并且 Linux 内核在自动配置它们方面已经取得了长足的进步。

我个人的建议是任何带有 es1370 或 es1371 芯片的卡,这些卡在 Linux 上使用 es1370 和 es1371 声音驱动程序。这些卡包括较旧的 Ensoniq es1370 和较新的 Creative PCI-128。这些卡非常便宜,并且在 Linux 下很容易使其工作。

我曾经是 Creative Soundblaster AWE 32、AWE 64 和 AWE 64 gold 声卡的粉丝。这些 ISA PnP 卡受到 OSS 和 Alsa 的良好支持。它们都使用相同的 E-mu 8000 合成芯片,这使它们能够同时播放 32 个声音(它们有 32 个“通道”)。一些注意事项:首先,《Soundblaster AWE HOWTO》已经非常过时了。其次,AWE 64 和 AWE 64 gold 可以同时播放 64 个声音,但这是在软件中完成的。Creative 从未发布这些卡的 Linux 驱动程序(他们也从未向 Linux 开发人员发布编程信息),因此 Linux 用户无法使用 AWE 64 和 AWE 64 gold 上的额外 32 个通道。就 Linux 用户而言,这三张卡是完全相同的(尽管 AWE 64 gold 具有镀金连接器,这比更常见的钢制连接器更利于音质)。

Creative Soundblaster Live! 是目前非常流行的 PCI 声卡。我从未拥有过,所以无法在此处评论。但是,有很多关于 Live! 和使用 686b 南桥的 AMD 主板存在严重问题的报告。谷歌搜索应该会找到很多关于此问题的信息。

更相关的问题是扬声器,但即使在这里,差异也不是很大。我用过昂贵的 Altec Lansing 扬声器,其性能仅比廉价扬声器略好。您购买扬声器时会得到您所支付的价值,但不要期望有巨大的差异。您会想要购买带有独立低音炮的扬声器;这确实会带来差异,但代价是额外的功率和连接线。

8.2. 为什么我的声音不工作?

首先,这可能不是游戏的问题,可能是您的设置问题。据我所知,在 Linux 下配置声卡有 3 个选项:Linux 内核自带的免费 OSS 声音驱动程序、Alsa 驱动程序和商业 OSS 声音驱动程序。就我个人而言,我更喜欢免费的 OSS 驱动程序,但很多人都推崇 Alsa。当您通过免费方法难以使声卡工作时,商业 OSS 驱动程序是很好的选择。不要低估它们;它们非常便宜(比如 10 或 20 美元),支持最新的声卡,并且可以消除配置过程中的很多猜测。

您的声音系统可能有 5 个问题

  1. 共享中断

  2. 驱动程序配置错误

  3. 某些程序已在访问声卡

  4. 您正在使用错误的驱动程序

  5. 权限问题

8.2.1. 共享中断

首先要做的是弄清楚您是否存在 IRQ 冲突。ISA 卡不能共享中断。PCI 卡可以共享中断,但某些类型的高带宽卡就是不喜欢共享,包括网卡和声卡。要找出您是否有冲突,请执行cat /proc/interrupts。在我的系统上的输出是

    $ cat /proc/interrupts
               CPU0       CPU1
      0:   24185341          0          XT-PIC  timer
      1:     224714          0          XT-PIC  keyboard
      2:          0          0          XT-PIC  cascade
      5:    2478476          0          XT-PIC  soundblaster
      5:     325924          0          XT-PIC  eth0
     11:     131326          0          XT-PIC  aic7xxx
     12:    2457456          0          XT-PIC  PS/2 Mouse
     14:     556955          0          XT-PIC  ide0
    NMI:          0          0
    LOC:   24186046   24186026
    ERR:       1353
					

第二列是因为我的机器中有 2 个 CPU;如果您只有一个 CPU(称为 UP 或单处理器),您将只有 1 个 CPU 列。左侧的数字是分配的 IRQ,右侧的字符串指示分配给该 IRQ 的设备。您可以看到我在声卡 (soundblaster) 和网卡 (eth0) 之间存在 IRQ 冲突。它们都共享 IRQ 5。实际上,我编造了这个例子,因为我想向您展示 IRQ 冲突是什么样的。但是,如果我真的有这个冲突,我的网络和声音都无法正常工作(或根本无法工作!)。

如果我的声卡是 PCI 的,解决此问题的首选方法是将其中一张卡移动到不同的插槽,并希望 BIOS 可以解决问题。更高级的解决方法是进入 BIOS 并将 IRQ 分配给特定的插槽。现代 BIOS 可以做到这一点。

8.2.2. 驱动程序配置错误

有时,卡会被硬连线以使用特定的 IRQ。您只能在 ISA 卡上看到这一点。或者,某些 ISA 卡可以使用卡本身上的跳线设置为使用特定的 IRQ。对于这些类型的卡,您需要将正确的 IRQ 和内存访问,“I/O 端口”传递给驱动程序。

这是一个特定于声卡的问题,超出了本 HOWTO 的范围。

8.2.3. 某些程序已在访问您的声卡

可能某个应用程序已经在访问您的声卡。例如,也许您有一个 MP3 播放器已暂停?如果某些程序已经在访问您的卡,则其他应用程序将无法访问。即使它被编写为在应用程序之间共享卡,但我发现 esd(enlightenment 声音守护程序)有时无法正常工作。这里最好的工具是 lsof,它可以显示哪些进程正在访问文件。您的声卡由/dev/dsp表示。现在,我正在用 mp3blaster 听 MP3(当然不是 Metallica 的 MP3...)。

    # lsof /dev/dsp
    COMMAND    PID USER   FD   TYPE DEVICE SIZE   NODE NAME
    mp3blaste 1108    p    6w   CHR   14,3      662302 /dev/dsp
					

fuser 与之类似;但它允许您向任何访问设备文件的进程发送信号。

    # fuser -vk /dev/dsp
    
                         USER        PID ACCESS COMMAND
    /dev/dsp             root       1225 f....  mp3blaster
                         root       1282 f....  mp3blaster
					

发出此命令后,mp3blaster 被 SIGKILL 信号终止。请参阅 lsof 和 fuser 的手册页;它们非常有用。哦,您需要以 root 身份运行它们,因为您将要请求来自可能由 root 拥有的进程的信息。

8.2.4. 您正在使用错误的驱动程序(或没有驱动程序)

只有两种方法可以配置您的卡

  1. 支持必须直接编译到内核中

  2. 您必须将正确的驱动程序加载到内存中

您可以通过执行 "lsmod" 或查看 "dmesg" 的输出来找出您的声卡正在使用哪个驱动程序。由于声音对我至关重要,我总是将声音编译到我的内核中。如果您没有加载驱动程序,则需要弄清楚已编译到内核中的内容。这不是很直接。最好的办法是编译您的内核。顺便说一句,让我说一下,编译您自己的内核是迈向精通 Linux 的第一步。第一次做的时候很痛苦,但是一旦你正确地做了,它就会变得非常容易,特别是如果您保留所有旧的 .config 文件并利用诸如 "make oldconfig" 之类的东西。有关详细信息,请参阅内核 HOWTO。

如果您没有自己编译内核,那么您的系统很可能设置为将声音驱动程序作为模块加载。这就是发行版做事的方式。将所有东西都编译为模块,并尝试加载它们。因此,如果您在 lsmod 中没有看到您的声卡驱动程序,则您的卡可能尚未配置。

8.2.5. 权限问题

如果声卡在您是 root 用户时工作,但在任何其他用户下都不工作,则您可能存在权限问题。如果是这种情况,请以 root 身份,使用以下命令查看声卡的用户组所有者ls -l /dev/dsp;它可能是audio。然后,以 root 身份,在/etc/group中将您的非 root 用户添加到 audio 组。例如,我在我的系统上将用户 p 和 wellspring 添加到了 audio 组

    audio:x:29:p,wellspring
					

如果您使用影子密码(在最近的大多数发行版中都应该是这种情况),请不要忘记使用 grpconv 以保持一致的组配置。然后注销并以非 root 用户身份重新登录。您的声卡应该可以工作了。感谢 James Barton 提醒我将此添加到 howto 中。