在 alsamixer 中,我可以选择 PCM Out 或 IEC958 In(这是我的 S/PDIF 输入),但不能同时选择两者。有解决方案吗?
注意:我需要立体声,因此不能为一个通道选择 IEC958 In,为另一个通道选择 PCM Out。
我甚至尝试了 OSS4,但结果是一样的:无法同时听到 S/PDIF 输入和 PCM 输出。我觉得我忽略了一些明显的东西,如果能得到任何帮助,我将不胜感激。
我想要这个的原因如下:我有两台电脑,并且都在使用它们。但是,为了充分利用第二台电脑,我需要听到它的声音,而无需在 alsamixer 中手动切换频道(是的,我知道可以编写脚本并将其分配给快捷方式,但这并不能解决我的问题)。
答案1
我终于找到了解决方案。我尝试了很多方法,但所有其他配置/方法要么给我带来不好的声音,要么在实践中也同样有效,但更复杂。所以我将在这里给出对我有用的最简单的解决方案(并提到一些可能至少对某些人有用的替代方案)。我使用 Debian Testing,所以我提到的一些东西是 Debian 特有的。在其他发行版中做同样的事情应该不会太难。
安装 JACK
apt-get install qjackctl jackd2
配置 ALSA
运行此命令:sudo apt-get install libasound2-plugins 这里是我的 /etc/asound.conf,您可以将其内容放在 ~/.asoundrc 中 - 但 /etc/asound.conf 是更好的选择,因为它是系统范围的。如您所见,它相对简单。设备“all”适用于 JACK,而 !default - 适用于所有非 JACK 应用程序。重要的是 !default 是插头类型而不是插孔类型,否则您将遇到各种奇怪的问题。您可以轻松地根据自己的需要调整我的 asound.conf - 希望您能清楚地了解如何添加或删除音频设备和频道。如果没有,请阅读文档 (http://alsa-project.org/main/index.php/Asoundrc)。
我的 asound.conf 中唯一的问题是,如果您像我一样指定了立体声模拟输入,则模拟输入(通常是麦克风)无法用作单声道。另一个奇怪的事情是,我在 JACK 中得到了很多 XRUN,但它们对我的情况[i]不[/i]影响音质,所以我忽略了它们。
重要提示:如果您的声卡支持硬件混音,则无需使用 ALSA JACK 插件的 !default 部分即可听到非 JACK 应用程序的声音。如果您不确定您的声卡支持什么功能,请运行:
cat /proc/asound/card0/pcm*/info | grep count
如果至少有一些设备有多个子设备,则您的卡可以进行硬件混音。如果您的默认频道上可以使用硬件混音,则可以从我的 asound.conf 示例中删除 !default 部分。
替代 ALSA 配置(不推荐!) 可以不使用 ALSA JACK 插件编写 asound.conf,但就我而言,这会导致声音不佳,尽管 buffer_size 很大(有时每分钟几个伪影,有时每几分钟一个伪影),即使在升级到 PF 内核后也是如此(稍后我会解释它是什么)。这并不奇怪,因为 JACK 必须尽可能直接使用您的音频设备,而这里的情况并非如此。如果您出于某种原因仍想尝试此操作,请参阅我的 /etc/asound.conf,其中不使用 ALSA JACK 插件(http://science.su/stuff/linux/sound/jack/without_alsa_jack_plugin/asound.conf)。它比第一个更复杂,但我试图让它尽可能易读。在尝试之前,请确保您在 JACK 和 asound.conf 中使用相同的 period_size 和 periods。我留下这个替代配置作为示例供您学习(您可以看到如何在 asound.conf 中使用各种类型,如何将单声道混音为立体声等)。
配置 JACK
这是我在 qjackctl 中的设置的屏幕截图。最重要的设置是“实时”、“输入设备”和“输出设备”。其他设置只是工作设置的示例。
升级到更好的内核
尝试迁移到 RT 内核是个好主意(最终 vanilla 内核将包含类似的实时支持,但在可预见的未来,如果您想要可接受的音频延迟且没有伪影,尤其是来自音频输入的伪影,则必须使用修补的内核)。要在 Debian Testing 或更高版本中尝试 RT 内核,您只需运行此命令(我假设您需要 NVidia 驱动程序;如果不需要,请安装您需要的任何驱动程序):
sudo apt-get install linux-image-3.4-trunk-rt-amd64 linux-headers-3.4-trunk-rt-amd64 nvidia-kernel-dkms
如果 RT 内核适合您,请随意跳过本消息的其余部分。使用 RT 内核,您可以听到完美的低延迟声音。但不幸的是,许多 NVidia 卡不适用于 RT 内核,我的就是其中之一(GeForce GTX 295),所以我无法使用 RT。
注意:使用 vanilla 内核时,即使使用相对较大的 buffer_size,我在模拟和数字输入中每分钟也会遇到几次类似点击的伪影 - 这是不可接受的,因此 vanilla 内核不适合我的目的。如果它适合您并且您可以接受相对较高的音频延迟(缓冲区)以获得可接受的声音,那么您显然不需要更改内核。
Debian 中的 NVidia 驱动程序已包含与 3.4 RT 内核配合使用的修改,您无需修改它,但不幸的是,它可能会给您黑屏而不是图形界面。在这种情况下,您必须卸载 RT 内核并尝试其他方法,例如 PF-kernel(http://pf.natalenko.name)。作者不提供 deb 文件,但链接到提供 deb 文件的人的网站(http://kernel.night-leshiy.ru) - 该网站是用非英语语言编写的,但无论是哪种语言,您都不需要理解它,只需下载带有 pf 内核及其标头的 deb 文件并使用以下命令安装它们:
sudo dpkg -i linux-*-pf*.deb
PF 内核包含 BFS 调度程序,在我的基于 Xeon 的四核工作站中,它有 8 个硬件线程(因此操作系统将其视为 8 个 CPU),它将实时进程(如 JACK)的最坏情况延迟从数百毫秒减少到几毫秒(在我的情况下不到 2 毫秒)。当然,如果与 RT 内核(实时进程的最坏情况延迟在 10-30 以内)进行比较,这看起来是非常糟糕的结果微秒范围内),但比 vanilla 内核好得多。我个人使用 128 buffer_size 和 2 个周期 - 即约 5ms 延迟;在我的情况下,这足以防止经过几个小时的测试后声音中出现任何伪影。使用 RT 内核,甚至可能获得更好的结果。
BFS 不是最好的调度程序,但如果您想要低延迟并且 RT 内核不适合您,它比 vanilla 内核中的调度程序效果好得多。如果您希望在没有 RT 内核的情况下尽可能减少延迟,可以使用改进的 BFS,其复杂度为 O(1) 而不是 O(n),甚至可能更好的调度程序 - RIFS。您可以在此处找到它们(http://code.google.com/p/rifs-scheduler/downloads/list) 如果你想编译自己的内核。如果愿意,请安装 kernel-package 并阅读此操作指南 (http://vanilja.org/kernel)。
希望我的经验对某些人有用。