首先,我承认我对Linux音频缺乏了解。它看起来很大,令人困惑,而且有点可怕。
我想做的是将音频从业余无线电节目传输gqrx
到数字语音解码器dsd
,如网络上流传的其他示例所示。
但是创建虚拟声音设备后/dev/dsp/
使用:
padsp -- dsd -i /dev/dsp -o /dev/dsp -fa -ma
当我打开时,我没有看到播放设备下列出了 dsd pavucontrol
(但我确实看到gqrx
列出了)?我尝试了很多不同的方法,但无法dsd
在播放设备下列出。需要执行此步骤才能进一步使用其他音频接收器来收听输出。
先感谢您...
答案1
为了让 Linux 音频不那么可怕,快速概述一下 Linux 音频历史(谷歌了解更多细节):
Linux 上第一个广泛使用的声音系统是开放式音响系统 (OSS),其中使用了类似的设备/dev/dsp
。现在 OSS 已经过时了,但仍然有专门使用它的旧程序,因此几乎所有其他音频系统都提供模拟层,例如padsp
Pulseaudio。
今天,Linux 中使用的基本音频系统是阿尔萨斯。它已成为内核的一部分,并为硬件提供驱动程序。设备看起来像/dev/snd/pcmC0D0p
(卡 0、设备 0、播放)或/dev/snd/pcmC1D2c
(卡 1、设备 2、捕获),但每个人都使用库 ( libalsa
) 直接代替设备,因为您无法像 那样将内容通过管道传输到其中/dev/dsp
。 ALSA可以通过配置/.asoundrc
,但是这个配置文件不太人性化。
如今大多数桌面系统还配备了 Pulseaudio。它运行在ALSA之上,不仅为OSS提供了一个兼容层,也为试图访问ALSA的程序提供了一个兼容层(使用一个名为 的伪ALSA设备pulse
)。您已经看到了pavucontrol
,还有 和pacmd
可以pactl
从命令行控制 Pulseaudio(不要问我为什么有两个......)。
回到你的问题。pavucontrol
运行后您应该在播放选项卡和录制选项卡中看到什么
padsp -- dsd -i /dev/dsp -o /dev/dsp -fa -ma
是类似的东西OSS emulation[dsd]
。可能您对“OSS 仿真”部分感到困惑(之所以存在,是因为padsp
OSS 仿真)。如果您确实没有看到这一点,请编辑您的问题,其中包含运行上述命令后可能出现的任何错误,以及pactl list short clients
命令运行时的输出。然后我们可以尝试调试出了什么问题。
在 Pulseaudio 中,每个音频接收器(例如,声卡的播放硬件)也有一个关联的.monitor
音频源。通过将第二个应用程序连接到.monitor
第一个应用程序正在播放的接收器的源,您可以将音频从一个应用程序传输到另一个应用程序。您可以在 中执行此操作puvacontrol
,如您已阅读的教程中所述。
在您的情况下,您想要监视 的声音输出gqrx
,因此您可以仅使用硬件音频接收器。你可以还创建一个具有关联源的“虚拟”音频接收器.monitor
,但您将听不到音频。
snd_aloop
是一种仅在 ALSA 中进行环回的不同(并且有些复杂)的方法。无论如何,当你运行 Pulseaudio 时,不用它。
编辑
我重现了你的问题如下这个博客条目关于如何设置dsd
和gqrx
,除了我得到五个流(您在“播放”和“录制”下看到的pavucontrol
是音频流,而不是设备),除了您的三个。我隐约记得我padsp
过去遇到过一些类似的问题(它创建了多个流,而它只应该创建一个流),但它只是通过忽略额外的流来工作。我还快速浏览了一下padsp.c
,流似乎仅在 I/O 发生时才创建。这可能就是为什么还没有播放流的原因。padsp
自博客文章撰写以来,情况可能发生了变化,并且在此过程中出现了一些问题。
因此,在“记录”下选择一个OSS emulation[dsd]
流(这些是输入的dsd
,它与您想要记录的内容无关),将其连接到正在播放的.monitor
任何接收器的输入gqrx
,向其提供有效数据(我在这里不能这样做,因为我不知道什么数据它期望,所以我无法测试),并查看是否获得播放流。
如果您只想在硬件中播放 dsd 的输出,请创建一个虚拟接收器
pacmd load-module module-null-sink sink_name=gqrx_to_dsd sink_properties=device.description=GQRX-to-DSD
选择该接收器作为 的输出gqrx
,并选择.monitor
该接收器的源作为 的输入dsd
。然后选择您的硬件音频接收器作为输出dsd
(如果您获得播放流)。