给出以下代码:
struct udev *udev_obj = udev_new();
struct udev_enumerate *udev_enum = udev_enumerate_new(udev_obj);
udev_enumerate_add_match_subsystem(udev_enum, "sound");
udev_enumerate_scan_devices(udev_enum);
struct udev_list_entry *udev_entries = udev_enumerate_get_list_entry(udev_enum);
struct udev_list_entry *udev_entry = NULL;
udev_list_entry_foreach(udev_entry, udev_entries) {
printf("%s\n", udev_list_entry_get_name(udev_entry));
}
我的 ThinkPad X1 Carbon 没有外部声音外围设备输出:
/sys/devices/pci0000:00/0000:00:1f.3/sound/card0
/sys/devices/pci0000:00/0000:00:1f.3/sound/card0/hwC0D0
/sys/devices/pci0000:00/0000:00:1f.3/sound/card0/hwC0D2
/sys/devices/pci0000:00/0000:00:1f.3/sound/card0/pcmC0D0c
/sys/devices/pci0000:00/0000:00:1f.3/sound/card0/pcmC0D0p
/sys/devices/pci0000:00/0000:00:1f.3/sound/card0/pcmC0D10p
/sys/devices/pci0000:00/0000:00:1f.3/sound/card0/pcmC0D3p
/sys/devices/pci0000:00/0000:00:1f.3/sound/card0/pcmC0D7p
/sys/devices/pci0000:00/0000:00:1f.3/sound/card0/pcmC0D8p
/sys/devices/pci0000:00/0000:00:1f.3/sound/card0/pcmC0D9p
/sys/devices/pci0000:00/0000:00:1f.3/sound/card0/controlC0
/sys/devices/virtual/sound/seq
/sys/devices/virtual/sound/timer
据我了解,C0 = 卡 0,D0 = 设备 0,c = 捕获/p = 播放。然而:
- 有什么区别卡0/硬件/pcm/控制/序列/定时器?
- 为什么有这么多奇怪的组合,例如卡0,设备3,然后卡0,设备7等等。逻辑上似乎没有加一
- 这里的父设备是什么?我如何获取它
libudev
?
答案1
1.)
card0
是单个声卡、主板集成的声音芯片或例如USB声音设备,可能有多个输入和输出。hw
虚拟文件用于硬件相关项目;基本上,如果声音芯片或其特定部分具有标准 ALSA 接口未涵盖的一些额外功能,则很可能可以通过这些虚拟文件访问这些功能。pcm
虚拟文件是声音数据的实际输入和输出通道。control
通道用于音量设置和类似的“标准”声卡控制。seq
如果您的声卡具有 MIDI 音序器功能,或用于外部 MIDI 乐器的 MIDI 接口,或类似timidity
可以与 ALSA 交互的软件合成器,则使用此选项。timer
当您安排许多不同的声音和谐地播放时,以及在许多其他与声音有关的事情中,这一点很重要。因此 ALSA 提供了一个针对音频相关目的进行优化的计时器接口。
2.) 只有设计计算机主板的个人或团队才能确定这一点。但现代 HD-Audio 兼容音频芯片可以拥有大量输入和输出,并可通过系统固件进行配置;也许主板设计者只是选择了物理上最容易连接到每个信号需要去的地方的输入/输出(例如,在声音芯片的正确一侧,或者其他地方)。
请注意,您的系统只有一个声音输入通道(笔记本电脑的内部麦克风),但有多个输出:一个是内部扬声器/耳机输出,但其他可能为 HDMI 输出和/或 DisplayPort 提供声音任何 USB Type-C 端口的备用模式:并且由于 DisplayPort 可以允许显示器的菊花链,因此每个 USB Type-C 端口可能有两个或更多声音输出通道。
3.) 在您的情况下,card0
是 ALSA 意义上的父设备,0000:00:1f.3
是其 PCI(e) 总线 ID。你的问题的这一部分不太清楚:你到底想做什么libudev
?
根据您想要做什么,类似的东西udevadm info -q all -a -p /sys/devices/pci0000:00/0000:00:1f.3/sound/card0/pcmC0D0p
可能会让您了解组件之间的关系。该特定总线 ID 是英特尔芯片组集成的 HD 音频声音芯片的典型总线 ID。