Qt:获取Linux中可用audio设备的列表

我想获得我的Linux系统上可用的所有audio设备的列表。 然后,我会将这个列表显示在一个combobox中,用户将从中select要用于logging/回放的设备。 根据用户的select,我将构buildQAudioInput和QAudioOutput进行录制/播放。

根据Qt文档,这可以使用QAudioDeviceInfo :: availableDevices静态方法完成。 此方法返回我系统中所有可用audio设备的列表。

我用这种方法列出了audio设备的数量。 这个方法应该返回一个只包含两个元素的列表,因为我的系统中安装了两个声卡(一个在主板上,另外一个是USB设备)。 但是它返回了一个包含23个项目的列表。 当我访问他们的名字时,我得到了像下面这样的东西 –

default pulse front:CARD=Intel,DEV=0 surround40:CARD=Intel,DEV=0 surround41:CARD=Intel,DEV=0 surround50:CARD=Intel,DEV=0 surround51:CARD=Intel,DEV=0 surround71:CARD=Intel,DEV=0 dmix:CARD=Intel,DEV=0 dsnoop:CARD=Intel,DEV=0 hw:CARD=Intel,DEV=0 plughw:CARD=Intel,DEV=0 front:CARD=default,DEV=0 surround40:CARD=default,DEV=0 surround41:CARD=default,DEV=0 surround50:CARD=default,DEV=0 surround51:CARD=default,DEV=0 surround71:CARD=default,DEV=0 iec958:CARD=default,DEV=0 dmix:CARD=default,DEV=0 dsnoop:CARD=default,DEV=0 hw:CARD=default,DEV=0 plughw:CARD=default,DEV=0 

这背后的原因可能是在后端使用的ALSA API 。 根据这篇文章, ALSA从逻辑上将声卡划分为多个逻辑audio设备,Qt API在查询驱动程序时将获取这些audio设备。

我不想列出所有这些名字供用户select。 我想列举一些像 –

 HDA-Intel USB-Audio 

用户将从中select他们想要的声卡。

有什么办法可以使用Qt来完成吗? 如果不是,我真的想知道在这里可以使用什么其他的替代scheme。

我知道这叫做解决方法,但是看起来你有这个信息,列出CARD =不同的值在你的列表中:在你的例子中,Intel和default。

如果您的应用程序应该是跨平台的,那么这个命令在其他操作系统下会返回什么?

显然唯一的方法是从Qt中触发aplay / arecord进程,从进程中获取结果输出,并解析输出字符串以查找卡片名称和相应的ID。 由于这种方法太依赖于这些进程的输出字符串格式,所以我没有使用它。

相反,我选择了PulseAudio服务器来获取我的系统上可用的设备。 我还将它用于音频I / O,因为它比Qt的多媒体API提供了更好的控制。