Portaudio 无法识别所有音频设备
Portaudio doesn't recognize all audio devices
这个问题是我在编写 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.I 已经在两台 linux 电脑上测试了这段代码 ubuntu 16 和 ubuntu 18.10 以及一些似乎不合理的调整来改变结果(我稍后会解释这种调整)结果非常荒谬。我首先 运行 我的应用程序在 Ubuntu 16 上,它检测到很多设备,包括 sysdefault(这是有用的)。然后我 运行 在 ubuntu 18 上使用相同的应用程序但它没有找到我的 sysdefault ,我检查了命令 aplay -L
和 arecord -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
question/request 是:什么导致了问题?它可能不是 alsa 那么它是 portaudio 吗?但它适用于第一种情况,所以它是 pulseaudio 吗?如果是,我现在如何解决问题?
毕竟问题出在Alsa身上。我在 Ubuntu 18 机器上有两张声卡(或至少两张虚拟声卡),默认情况下 Alsa 只读取一张。这个问题有很多解决方法,对我有用的是 change/create 配置文件 /etc/asound.conf
两行:
defaults.pcm.card 2
defaults.ctl.card 1
~
这改变了默认卡。
这个问题是我在编写 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.I 已经在两台 linux 电脑上测试了这段代码 ubuntu 16 和 ubuntu 18.10 以及一些似乎不合理的调整来改变结果(我稍后会解释这种调整)结果非常荒谬。我首先 运行 我的应用程序在 Ubuntu 16 上,它检测到很多设备,包括 sysdefault(这是有用的)。然后我 运行 在 ubuntu 18 上使用相同的应用程序但它没有找到我的 sysdefault ,我检查了命令 aplay -L
和 arecord -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
question/request 是:什么导致了问题?它可能不是 alsa 那么它是 portaudio 吗?但它适用于第一种情况,所以它是 pulseaudio 吗?如果是,我现在如何解决问题?
毕竟问题出在Alsa身上。我在 Ubuntu 18 机器上有两张声卡(或至少两张虚拟声卡),默认情况下 Alsa 只读取一张。这个问题有很多解决方法,对我有用的是 change/create 配置文件 /etc/asound.conf
两行:
defaults.pcm.card 2
defaults.ctl.card 1
~
这改变了默认卡。