Linux

程式中的 Pulse Audio 找不到我的所有設備

  • June 30, 2019

我在編寫 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 擁有的設備。我已經在兩台 linux pc 上用 ubuntu 16 和 ubuntu 18.10 測試了這段程式碼,並進行了一些似乎不合理的調整來改變結果(我將在之後解釋這些調整)結果是很荒謬。我第一次在 Ubuntu 16 上執行我的應用程序,它檢測到很多設備,包括 sysdefault(這是有用的設備)。然後我在 ubuntu 18 上執行相同的應用程序,它沒有找到我 sysdefault ,我檢查了命令aplay -Larecord -LAlsa 正在辨識 sysdefault 所以我認為這是一個脈衝音頻問題。我下載了 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嗎?如果是的話,既然我複制了它,我該如何解決這個問題?

畢竟問題是由 Alsa 發生的。我必須在 Ubuntu 18 機器上安裝音效卡(或至少是虛擬音效卡),而 Alsa 預設只讀取一個。這個問題有很多解決方法,對我有用的是更改/創建配置/etc/asound.conf包含這兩行的文件:

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

~

那改變了預設卡。

所以這段程式碼應該列印我擁有的聲音 io 設備。

不,它沒有。它列印Portaudio設備,這是一種抽象,可能會或可能不會解析為ALSA設備(儘管今天在大多數情況下可能會)。

特別是 Portaudio 開發人員似乎決定只包含一些 ALSA 設備(特別是純硬體設備),而不包含任何 ALSA 外掛。

如果要列出所有ALSA設備,為什麼不使用 ALSA 庫而不是 Portaudio?Portaudio 總是會給你一些抽象,所以你要麼接受這個抽象並使用它,要麼不使用 Portaudio。

另請注意,Pulseadio會產生一個完全不同的問題:Pulseaudio 將獲取您所有的硬體 ALSA 設備,因此您可以從 Portaudio 使用的唯一設備是pulse(或者default,如果它指向pulse)。

因此,如果您想使用 Pulseaudio 並列出 Pulseaudio 接收器(包括 Pulseaudio 看到的硬體設備),請使用 Pulseaudio 庫。

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