2011-11-14 46 views
3

我想要獲取我的Linux系統上可用的所有音頻設備的列表。然後我會將這個列表顯示在一個組合框中,用戶將從中選擇用於錄製/播放的設備。根據用戶的選擇,我將構建QAudioInputQAudioOutput進行錄製/播放。Qt:獲取Linux中可用音頻設備的列表

根據Qt文檔,這可以通過使用QAudioDeviceInfo::availableDevices靜態方法來完成。此方法返回我係統中所有可用音頻設備的列表。

我已經使用這種方法來列出音頻設備的數量。這個方法應該返回一個只包含兩個元素的列表,因爲我的系統中安裝了兩個聲卡(一個在主板上,另一個是USB設備)。但它返回了一個包含23個項目的列表。當我訪問他們的名字,我得到了類似下面 -

default 
pulse 
front:CARD=Intel,DEV=0 
surround40:CARD=Intel,DEV=0 
surround41:CARD=Intel,DEV=0 
surround50:CARD=Intel,DEV=0 
surround51:CARD=Intel,DEV=0 
surround71:CARD=Intel,DEV=0 
dmix:CARD=Intel,DEV=0 
dsnoop:CARD=Intel,DEV=0 
hw:CARD=Intel,DEV=0 
plughw:CARD=Intel,DEV=0 
front:CARD=default,DEV=0 
surround40:CARD=default,DEV=0 
surround41:CARD=default,DEV=0 
surround50:CARD=default,DEV=0 
surround51:CARD=default,DEV=0 
surround71:CARD=default,DEV=0 
iec958:CARD=default,DEV=0 
dmix:CARD=default,DEV=0 
dsnoop:CARD=default,DEV=0 
hw:CARD=default,DEV=0 
plughw:CARD=default,DEV=0 

這背後的原因可能是在後端使用的ALSA API。根據this article ALSA邏輯上將聲卡劃分爲多個邏輯音頻設備,Qt API在查詢驅動程序時會提取這些音頻設備。

我不想列出所有這些名稱供用戶選擇。我想列出類似 -

HDA-Intel 
USB-Audio 

從哪些用戶,然後選擇自己想要的聲卡..

有什麼辦法這可以用Qt做什麼?如果不是,我真的很想知道在這裏可以使用什麼其他替代方案。

回答

0

顯然,唯一的方法是從Qt中啓動aplay/arecord進程,從進程獲取結果輸出並解析輸出字符串以查找卡名和相應的ID。由於這種方法太依賴於這些進程的輸出字符串格式,因此我沒有使用它。

取而代之,我選擇了PulseAudio服務器來獲取我的系統上可用的設備。我還將它用於音頻I/O,因爲它比Qt的多媒體API提供更好的控制。

0

我知道這叫做解決方法,但是看起來你有這個信息,列出CARD =的不同值,在你的列表中:在你的例子中,Intel和default。

如果您的應用程序應該是跨平臺的,那麼此命令在其他操作系統下返回的是什麼?

+0

此命令適當地返回可用音頻設備(在Windows 7上測試它)。 Qt的多媒體依賴於底層音頻驅動程序,即Linux的ALSA。 ALSA將所有這些設備中的聲卡劃分出來,所以Qt只是提取這些聲卡並顯示它。無論如何,這裏的解決方法是直接使用ALSA或像PulseAudio或Jack(我選擇PulseAudio)這樣的聲音服務器。 –

相關問題