脉冲音频编程找不到我的所有设备

脉冲音频编程找不到我的所有设备

我在编写 C++ 程序时出现了这个问题,因此我创建了代码的最小实例来更好地阐明问题:

#include <portaudio.h>
#include <iostream>

int main()
{
    Pa_Initialize();

    int devices = Pa_GetDeviceCount();
    std::cout << devices << std::endl;

    for (int i = 0; i != devices; ++i) 
    {
        auto * info = Pa_GetDeviceInfo(i);
        std::cout << info->name << std::endl;
    }

    Pa_Terminate();
}

所以这段代码应该打印我拥有的声音 io 设备。我已经在两台 ubuntu 16 和 ubuntu 18.10 的 linux 电脑上测试了这段代码,并进行了一些似乎不合理的调整来改变结果(我稍后会解释这些调整)结果是非常荒唐。我第一次在 Ubuntu 16 上运行我的应用程序,它检测到很多设备,包括 sysdefault(这是有用的设备)。然后我在 ubuntu 18 上运行相同的应用程序,它没有找到我的 sysdefault,我检查了命令aplay -Larecord -L发现 Alsa 正在识别 sysdefault,所以我认为这是一个pulseaudio 问题。我下载了 pavucontrol 并做了一些调整,但没有成功。最后,这是更不合理的事情,我在下载并调整 pavucontrol 后再次尝试在 ubuntu 16 上使用我的应用程序,但它不起作用,而且当我在 ubuntu 16 上删除 pavucontrol 时它起作用了,但是当我在 ubuntu 18 上执行相同操作时它没有!值得一提的是,我的 ubuntu 16 是一个旧系统,我安装了很多 cpp 库,并且在过去几年中做了很多调整,而另一方面我的 ubuntu 18 是一台格式化的笔记本电脑,几乎没有安装任何东西在上面。这里我添加一些控制台输出以便更好地理解问题:

$aplay -L
> 
> default
>     Playback/recording through the PulseAudio sound server null
>     Discard all samples (playback) or generate zero samples (capture) pulse
>     PulseAudio Sound Server hdmi:CARD=HDMI,DEV=0
>     HDA Intel HDMI, HDMI 0
>     HDMI Audio Output hdmi:CARD=HDMI,DEV=1
>     HDA Intel HDMI, HDMI 1
>     HDMI Audio Output hdmi:CARD=HDMI,DEV=2
>     HDA Intel HDMI, HDMI 2
>     HDMI Audio Output dmix:CARD=HDMI,DEV=3
>     HDA Intel HDMI, HDMI 0
>     Direct sample mixing device dmix:CARD=HDMI,DEV=7
>     HDA Intel HDMI, HDMI 1
>     Direct sample mixing device dmix:CARD=HDMI,DEV=8
>     HDA Intel HDMI, HDMI 2
>     Direct sample mixing device dsnoop:CARD=HDMI,DEV=3
>     HDA Intel HDMI, HDMI 0
>     Direct sample snooping device dsnoop:CARD=HDMI,DEV=7
>     HDA Intel HDMI, HDMI 1
>     Direct sample snooping device dsnoop:CARD=HDMI,DEV=8
>     HDA Intel HDMI, HDMI 2
>     Direct sample snooping device hw:CARD=HDMI,DEV=3
>     HDA Intel HDMI, HDMI 0
>     Direct hardware device without any conversions hw:CARD=HDMI,DEV=7
>     HDA Intel HDMI, HDMI 1
>     Direct hardware device without any conversions hw:CARD=HDMI,DEV=8
>     HDA Intel HDMI, HDMI 2
>     Direct hardware device without any conversions plughw:CARD=HDMI,DEV=3
>     HDA Intel HDMI, HDMI 0
>     Hardware device with all software conversions plughw:CARD=HDMI,DEV=7
>     HDA Intel HDMI, HDMI 1
>     Hardware device with all software conversions plughw:CARD=HDMI,DEV=8
>     HDA Intel HDMI, HDMI 2
>     Hardware device with all software conversions sysdefault:CARD=PCH
>     HDA Intel PCH, ALC3234 Analog
>     Default Audio Device front:CARD=PCH,DEV=0
>     HDA Intel PCH, ALC3234 Analog
>     Front speakers surround21:CARD=PCH,DEV=0
>     HDA Intel PCH, ALC3234 Analog
>     2.1 Surround output to Front and Subwoofer speakers surround40:CARD=PCH,DEV=0
>     HDA Intel PCH, ALC3234 Analog
>     4.0 Surround output to Front and Rear speakers surround41:CARD=PCH,DEV=0
>     HDA Intel PCH, ALC3234 Analog
>     4.1 Surround output to Front, Rear and Subwoofer speakers surround50:CARD=PCH,DEV=0
>     HDA Intel PCH, ALC3234 Analog
>     5.0 Surround output to Front, Center and Rear speakers surround51:CARD=PCH,DEV=0
>     HDA Intel PCH, ALC3234 Analog
>     5.1 Surround output to Front, Center, Rear and Subwoofer speakers surround71:CARD=PCH,DEV=0
>     HDA Intel PCH, ALC3234 Analog
>     7.1 Surround output to Front, Center, Side, Rear and Woofer speakers dmix:CARD=PCH,DEV=0
>     HDA Intel PCH, ALC3234 Analog
>     Direct sample mixing device dsnoop:CARD=PCH,DEV=0
>     HDA Intel PCH, ALC3234 Analog
>     Direct sample snooping device hw:CARD=PCH,DEV=0
>     HDA Intel PCH, ALC3234 Analog
>     Direct hardware device without any conversions plughw:CARD=PCH,DEV=0
>     HDA Intel PCH, ALC3234 Analog
>     Hardware device with all software conversions

并运行应用程序:

$./main
6
HDA Intel HDMI: 0 (hw:0,3)
HDA Intel HDMI: 1 (hw:0,7)
HDA Intel HDMI: 2 (hw:0,8)
hdmi
pulse
default

问题/请求是:是什么造成了问题?它可能不是 alsa 那么它是 portaudio 吗?但它适用于第一种情况,所以它是pulseaudio吗?如果是的话,现在我重现了它,我该如何解决问题?

答案1

所以这段代码应该打印我拥有的声音 io 设备。

不,事实并非如此。它打印出波塔迪奥设备,这是一个抽象,可能会也可能不会解析阿尔萨斯设备(尽管今天在大多数情况下可能会如此)。

特别是 Portaudio 开发人员似乎决定仅包含一些 ALSA 设备(特别是纯硬件设备),而不包含任何 ALSA 插件。

如果你想列出所有阿尔萨斯设备,为什么不使用 ALSA 库而不是 Portaudio? Portaudio 总是会给你一些抽象,所以你要么接受这个抽象并使用它,要么不使用 Portaudio。

另请注意脉冲广播产生了一个完全不同的问题:Pulseaudio 将获取您所有的硬件 ALSA 设备,因此您可以从 Portaudio 使用的唯一设备是pulse(或者default,如果它指向pulse)。

因此,如果您想使用 Pulseaudio 并列出 Pulseaudio 接收器(其中包括 Pulseaudio 看到的硬件设备),请使用 Pulseaudio 库。

答案2

毕竟问题是阿尔莎出的。我必须在 Ubuntu 18 机器上安装声卡(或者至少是虚拟声卡),而 Alsa 默认情况下只读取声卡。这个问题有很多解决方法,对我有用的方法是更改​​/创建配置文件/etc/asound.conf包含这两行:

defaults.pcm.card 2
defaults.ctl.card 1


这改变了默认卡。

相关内容