Kernel

Linux/Udev 音頻設備命名說明

  • March 25, 2021

給定以下程式碼:

 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 = 播放。然而:

  1. card0 /hw/pcm/control/seq/timer 和有什麼不一樣?
  2. 為什麼會有這麼多奇怪的組合,例如卡 0,設備 3,然後是卡 0,設備 7 等。它似乎在邏輯上不會加一
  3. 這裡的父設備是什麼,我將如何獲得它libudev

1.)

  • card0是單個音效卡、主機板集成聲音晶片或例如 USB 聲音設備,它可能具有多個輸入和輸出。
  • hw虛擬文件用於硬體相關項目;基本上,如果聲音晶片或其特定部分具有標準 ALSA 介面未涵蓋的一些額外功能,則很可能可以通過這些虛擬文件訪問這些功能。
  • pcm虛擬文件是聲音數據的實際輸入和輸出通道。
  • controlchannel 用於音量設置和類似的“標準”音效卡控制。
  • 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 是 Intel 晶片組集成的 HD Audio 聲音晶片的典型特徵。

引用自:https://unix.stackexchange.com/questions/640965