1. 程式人生 > >Linux alsa 指南

Linux alsa 指南

1.  簡介

ALSA是Advanced Linux Sound Architecture,高階Linux聲音架構的簡稱,它在Linux作業系統上提供了音訊和MIDI(Musical Instrument Digital Interface,音樂裝置數字化介面)的支援。在2.6系列核心中,ALSA已經成為預設的聲音子系統,用來替換2.4系列核心中的OSS(Open Sound System,開放聲音系統)。

ALSA的主要特性包括:高效地支援從消費類入門級音效卡到專業級音訊裝置所有型別的音訊介面,完全模組化的設計, 支援對稱多處理(SMP)和執行緒安全,對OSS的向後相容,以及提供了使用者空間的alsa-lib

庫來簡化應用程式的開發。

從歷史上來說,Gentoo提供了兩種方法可以使ALSA執行在您的系統上:核心自帶的驅動和外部的alsa-driver軟體包。這兩種方案基本上完成的是同一項任務;這使得提供對外部軟體包的支援異常困難和耗時。Gentoo維護者決定不再繼續對alsa-driver軟體包進行支援,而是將他們的資源集中在Linux核心中的ALSA驅動部分。這份指南將只集中介紹如何通過在核心自帶的驅動來配置ALSA。

如果你仍然需要alsa-driver軟體包,請發郵件至Gentoo ALSA維護團隊,並告之為何在核心自帶的驅動不能正常工作,記得包括具體的出錯資訊。

2.  安裝ALSA

首先,您需要知道您的音效卡用什麼驅動。大多數情況下,音效卡(板載和獨立音效卡)基於PCI匯流排,lspci將幫助您獲取所需的資訊。如果您沒有安裝lspci,請emerge sys-apps/pciutils。如果您使用的是USB音效卡,sys-apps/usbutilslsusb或許有用。ISA音效卡的使用者,請試一下sys-apps/isapnptools。下列頁面對使用ISA音效卡的使用者也許有所幫助:

注意: 為了便於解釋,我們在下文中假設使用者使用的是基於PCI匯流排的音效卡。

下一步,我們將找出音效卡的詳細資訊。

程式碼 2.1: 音效卡的詳細資訊

lspci -v | grep -i audio
0000:00:0a.0 Multimedia audio controller: Creative Labs SB Live! EMU10k1 (rev 06)

現在我們知道機器裡的音效卡是Sound Blaster Live!,而且音效卡的製造商是Creative Labs。看一下ALSA音效卡支援表,選擇Creative Labs。您將會跳轉到Creative Labs支援裝置表的頁面,您可以看到SB Live!採用emu10k1模組。這正是我們所需要的資訊。如果您對技術細節有興趣,您可以點選"詳細資訊"旁邊的的連結,訪問emu10k1的相關頁面。

如果您想使用MIDI, 在emerge任何ALSA軟體包之前,您必須在/etc/make.conf裡,把midi加入到您的USE標記中。我們在下文中將會介紹如何設定MIDI支援

配置核心

注意: 自從2005.0版,Gentoo Linux使用2.6系列作為預設的核心。請確認您的核心是2.6系列。以下方法並不適用於2.4核心。

讓我們配置核心來啟用ALSA選項

重要: genkernel的使用者請先執行genkernel --menuconfig all,然後參考ALSA核心配置

程式碼 2.2: 編譯核心

cd /usr/src/linuxmake menuconfig

注意: 上述例子假設/usr/src/linux符號連結指向您想使用的核心原始碼。在下一步之前,請確定上述條件。

現在我們要看一下在2.6核心下要開啟哪些選項使得ALSA能夠支援我們的音效卡。

請注意:由於考慮到易用性,下面的例子中ALSA都被編譯成模組。我們建議您採用相同的步驟,從而可以使用alsaconf來配置您的音效卡。請不要跳過本文的配置部分。如果您還是希望將其編入核心,請作相應的調整。

程式碼 2.3: ALSA核心配置

Device Drivers --->
Sound --->

(這個選項需要開啟)
<M> Sound card support

(確保OSS被禁用)
Open Sound System --->
< > Open Sound System (DEPRECATED)

(回到上一步進入ALSA)
Advanced Linux Sound Architecture --->
<M> Advanced Linux Sound Architecture
(如果您需要MIDI序列化或者路由,請選擇此選項)
<M> Sequencer support
(老式的/dev/mixer*和/dev/dsp*支援。推薦。)
<M> OSS Mixer API
<M> OSS PCM (digital audio) API 

(您現在可以要支援的裝置。通常您只有一種裝置,如果您有多塊音效卡,請在這裡啟用全部裝置。

(主要用於測試和開發,除非您知道自己在作什麼,一般使用者不需要啟用此選項。)
Generic devices --->

(ISA音效卡需要此選項)
ISA devices --->
(如果您有Gravis裝置,請選擇此選項)
<M> Gravis UltraSound Extreme

(回到上一級進入PCI裝置,現在大多數音效卡是PCI裝置)
PCI devices --->
(我們現在為我們的音效卡選擇emu10k1驅動)
<M> Emu10k1 (SB Live!, Audigy, E-mu APS)
(或者是Intel的音效卡)
<M> Intel/SiS/nVidia/AMD/ALi AC97 Controller
(或者您使用的是VIA的音效卡)
<M> VIA 82C686A/B, 8233/8235 AC97 Controller

(如果您的音效卡是USB介面,回到上一級,選擇
USB Devices --->

現在所有的選項都配置好了,您可以(重新)編譯核心,音效卡的ALSA支援應該在重啟後使用新核心時生效。不要忘了更新您的GRUB配置並使用新編譯的核心。您可以前進到ALSA實用工具檢視是否一切都工作正常。

3.  配置/測試ALSA

alsa-utils是ALSA不可或缺的一部分,它集成了一些非常有用的應用程式,包括ALSA啟動指令碼。所以我們強烈建議您安裝alsa-utils

程式碼 3.1: 安裝alsa-utils

emerge alsa-utils

注意: 如果您沒有將ALSA編譯成模組,請前進至ALSA啟動指令碼部分。否則您需要配置ALSA。由alsa-utils提供的alsaconf使得這個過程相當容易。

配置

最新版本的udev (>=udev-103)為您的音效卡提供了某種程度上的核心級自動配置。如果可能的話,讓核心自動來設定您的音效卡。否則如下所示,用alsaconf來配置您的音效卡。

注意: 在執行時alsaconf,請關閉所有可能訪問音效卡的程式。

要配置您的音效卡,請以root身份登入控制檯,鍵入alsaconf

程式碼 3.2: 啟動alsaconf

alsaconf

您會看到一個由選單引導的乾淨介面,它將自動探測您的裝置,發現您的音效卡。您會被要求從一個列表中選擇您的音效卡。然後它會請求修改/etc/modules.d/alsa,自動調整音量到合適的位置,執行update-modules並啟動/etc/init.d/alsasound服務。alsaconf退出後,您可以進一步設定ALSA啟動指令碼。

我們幾乎完成了所有的配置。無論您採用何種方法來安裝ALSA,您都需要在系統啟動的時候,載入模組,初始化ALSA,恢復您的音量設定。ALSA啟動指令碼可以為您處理所有的這一切,它就是alsasound。 我們將它加入到啟動執行級。

程式碼 3.3: 將ALSA加入到啟動執行級

rc-update add alsasound boot
* alsasound added to runlevel boot
* rc-update complete.

下一步,檢查/etc/conf.d/alsasound檔案,確保SAVE_ON_STOP變數設定為yes。這將在您關閉系統時儲存您的聲音設定。

在我們開始測試之前,最後還有一個重要設定。類Unix作業系統的經驗——除非必要,不要執行在root許可權,也適用於此;)。怎麼做呢?大多數時間,您以普通使用者的身份登入系統聽音樂或者訪問您的音效卡。因此,您需要在""audio" 組中。在此,我們將使用者加入到audio組中,當他們需要訪問音效卡的時候就不會有任何問題。我們需要以root的身份登入,執行gpasswd

程式碼 3.4: 將使用者加入audio組

(用您的使用者替換 <username> )gpasswd -a <username> audio 
將使用者 <username> 加入audio組

音量檢查!

我們完成了所有的設定和前期工作,讓我們啟動ALSA吧。如果您已經運行了alsaconf,您可以跳過這一步,因為alsaconf已經完成了下述工作。

程式碼 3.5: 啟動服務

/etc/init.d/alsasound start

所有的問題都得到了解決,我們要檢查一下音量。多數情況下,系統是靜音的。我們用alsamixer來調整音量。

程式碼 3.6: 啟動alsamixer

(開啟一個控制檯程式。僅顯示需要的配置)alsamixer

重要: 如果您無法啟動alsamixer,且收到這樣的錯誤alsamixer: function snd_ctl_open failed for default: No such file or directory,這通常是因為udev無法設定裝置。執行killall udevd; udevstart來重新載入/dev下的相關裝置檔案,然後啟動alsamixer。這應該能夠解決問題。

也許是ALSA Mixer在您首次開啟時的介面。請注意Master和PCM聲道,它們下面都有MM的標記。這意味著它們都被靜音了。如果在此狀態下,您試圖播放任何音訊檔案,您將無法從您的揚聲器裡聽到任何聲音。


圖示 3.1: Alsa Mixer主視窗,靜音

Fig. 1: AlsaMixer靜音

現在,我們要禁止靜音,並根據需要設定音量。

警告: 如果您想從您的揚聲器裡聽到任何聲音,Master和PCM聲道不能設定為靜音模式,並且音量必須調整到聽得見的水平。

  • 使用您的左右箭頭鍵(<- & ->)來轉換聲道。
  • 要靜音/禁止靜音,移動到該聲道,比如說Master,按鍵盤上的m鍵。
  • 用上下箭頭鍵來增加/減小音量。

注意: 設定低音和顫音的時候請注意,50通常是一個合適的值。除非特製的低音音箱,過強的低音會導致揚聲器發出刺耳的雜音。

作完了這些以後,您的ALSA Mixer應該看起來如下。請注意00標記,而非MM標記;而且音量也作了調整。


圖示 3.2: Alsa Mixer蓄勢待發

Fig. 2: AlsaMixer禁止靜音

聲音測試!

終於可以來點音樂了。如果上述一切工作正常,您可以聽些不錯的音樂了。一個快捷的測試方法是執行像media-sound/madplay這樣的命令列工具。您也可以用一些更有名的工具,比如mpg123。如果您青睞ogg, 您可以使用由media-sound/vorbis-tools提供的ogg123。選一個您用著舒服的程式。一直如此,emerge您想要的。

程式碼 3.7: 獲取軟體

(安裝您所需的應用程式)emerge madplay mpg123
(播放.ogg檔案)emerge vorbis-tools

播放您喜愛的音樂……

程式碼 3.8: 播放音樂

madplay -v /mnt/shyam/Music/Paul\ Oakenfold\ -\ Dread\ Rock.mp3
MPEG Audio Decoder 0.15.2 (beta) - Copyright (C) 2000-2004 Robert Leslie et al.
Title: Dread Rock
Artist: Paul Oakenfold
Album: Matrix Reloaded
Year: 2003
Genre: Soundtrack
Soundtrack
00:04:19 Layer III, 160 kbps, 44100 Hz, joint stereo (MS), no CRC

# ogg123 Paul\ Oakenfold\ -\ Dread\ Rock.ogg
Audio Device: Advanced Linux Sound Architecture (ALSA) output

Playing: Paul Oakenfold - Dread Rock.ogg
Ogg Vorbis stream: 2 channel, 44100 Hz
Genre: Soundtrack
Transcoded: mp3;160
Title: Dread Rock
Artist: Paul Oakenfold
Date: 2003
Album: Matrix Reloaded
Time: 00:11.31 [04:28.75] of 04:40.06 (200.6 kbps) Output Buffer 96.9%

現在您可以把alsa use標記加入到/etc/make.conf使得您的應用程式如果支援ALSA,就在編譯時加入這個特性。某些架構,比如x86和amd64預設加入了這個標記。

問題?

如果由於某些原因,您無法聽到聲音,請您首先檢視alsamixer 設定,80%的問題源於聲道被靜音或者音量過低。您也可以檢視您的視窗管理器的聲音小程式以確保音量被調整到聽得見的水平。

/proc是您的朋友。在此/proc/asound是您最好的朋友。我們將簡單的看一下它能提供多少有用的資訊。

程式碼 3.9: 有趣的/proc/asound

(首先,如果/proc/asound/cards顯示了您的音效卡,ALSA
在所選的音效卡上工作正常。)cat /proc/asound/cards
0 [Live ]: EMU10K1 - Sound Blaster Live!
Sound Blaster Live! (rev.6, serial:0x80271102) at 0xb800, irq 11

(這顯示了現在執行的ALSA的版本)cat /proc/asound/version
Advanced Linux Sound Architecture Driver Version 1.0.8 (Thu Jan 13 09:39:32 2005 UTC).

(ALSA OSS模擬層詳解)cat /proc/asound/oss/sndstat
Sound Driver:3.8.1a-980706 (ALSA v1.0.8 emulation code)
Kernel: Linux airwolf.zion 2.6.11ac1 #2 Wed May 4 00:35:08 IST 2005 i686
Config options: 0

Installed drivers:
Type 10: ALSA emulation

Card config:
Sound Blaster Live! (rev.6, serial:0x80271102) at 0xb800, irq 11

Audio devices:
0: EMU10K1 (DUPLEX)

Synth devices: NOT ENABLED IN CONFIG

Midi devices:
0: EMU10K1 MPU-401 (UART)

Timers:
7: system timer

Mixers:
0: SigmaTel STAC9721/23

其他使用者碰到的常見問題是可怖的"Unknown symbol in module"錯誤。舉例如下。

程式碼 3.10: Unknown Symbol in module錯誤

/etc/init.d/alsasound start
* Loading ALSA modules ...
* Loading: snd-card-0 ... [ ok ]
* Loading: snd-pcm-oss ...
WARNING: Error inserting snd_mixer_oss
(/lib/modules/2.6.12-gentoo-r6/kernel/sound/core/oss/snd-mixer-oss.ko): Unknown
symbol in module, or unknown parameter (see dmesg) FATAL: Error inserting
snd_pcm_oss
(/lib/modules/2.6.12-gentoo-r6/kernel/sound/core/oss/snd-pcm-oss.ko): Unknown
symbol in module, or unknown parameter (see dmesg) 
[ !! ]
* Loading: snd-mixer-oss ...
FATAL: Error inserting snd_mixer_oss
(/lib/modules/2.6.12-gentoo-r6/kernel/sound/core/oss/snd-mixer-oss.ko): Unknown
symbol in module, or unknown parameter (see dmesg) 
[ !! ]
* Loading: snd-seq ... [ ok ]
* Loading: snd-emu10k1-synth ... [ ok ]
* Loading: snd-seq-midi ... [ ok ]
* Restoring Mixer Levels ... [ ok ]

建議您看一下dmesg的輸出,您很有可能會看到類似的結果:

程式碼 3.11: dmesg輸出

(僅顯示相關部分)dmesg | less
ACPI: PCI Interrupt 0000:02:06.0[A] -> Link [APC3] -> GSI 18 (level, low) -> IRQ 209
snd_mixer_oss: Unknown symbol snd_unregister_oss_device
snd_mixer_oss: Unknown symbol snd_register_oss_device
snd_mixer_oss: Unknown symbol snd_mixer_oss_notify_callback
snd_mixer_oss: Unknown symbol snd_oss_info_register
snd_pcm_oss: Unknown symbol snd_unregister_oss_device
snd_pcm_oss: Unknown symbol snd_register_oss_device
snd_pcm_oss: Unknown symbol snd_mixer_oss_ioctl_card
snd_pcm_oss: Unknown symbol snd_oss_info_register
snd_mixer_oss: Unknown symbol snd_unregister_oss_device
snd_mixer_oss: Unknown symbol snd_register_oss_device
snd_mixer_oss: Unknown symbol snd_mixer_oss_notify_callback
snd_mixer_oss: Unknown symbol snd_oss_info_register

上述問題是由於您從alsa-driver轉換到核心自帶的ALSA而造成的, 在您解除安裝alsa-driver時,核心模組由於受保護而沒有移除。所以當您使用核心自帶的ALSA,執行modprobe時, alsa-driver和核心自帶的驅動混在一起,造成了上述的錯誤。

解決方案相當簡單。我們只需要在unmerge alsa-driver後手動刪除出問題的目錄。請確定您刪除的是正確的核心版本而非當前的版本!

程式碼 3.12: 刪除alsa-driver模組

rm -rf /lib/modules/$(uname -r)/alsa-driver

另一個引起類似錯誤的可能是在/etc/modules.d中的某個檔案錯誤地輸出了 device_mode引數。請確認這是問題所在,並且找出這個搗蛋鬼。

程式碼 3.13: 確認並查詢device_mode

(檢視dmesg以確認)dmesg | grep device_mode
snd: Unknown parameter `device_mode'
(現在,找到問題的根源)grep device_mode /etc/modules.d/*

通常是一個叫alsa的檔案包含了一行: options snd device_mode=0666。刪除此行,重啟alsasound服務應該能夠解決問題。

4.  其他

首先請確定/etc/make.confmidi USE標記。如果沒有,請加上它。您需要重新emerge任何使用了midi標記的ALSA軟體包,比如alsa-libalsa-utils

如果您的音效卡有板載的MIDI合成器並且您希望聽一些.mid檔案,您需要安裝awesfx,它基本上是一組實用工具來控制AWE32驅動。我們首先要安裝它。如果沒有硬體合成器,您可以使用虛擬合成器,更多資訊,請檢視虛擬合成器一節。

程式碼 4.1: 安裝awesfx

emerge awesfx

注意: 然後您需要從音效卡驅動光碟或者Windows安裝檔案中複製SoundFont (SF2)檔案到/usr/share/sounds/sf2/。舉例來說,SBLive!的SoundFont檔案可以是8MBGMSFX.SF2.

複製了Soundfont檔案以後,我們可以如下所示播放midi檔案。您也可以把asfxload命令加入到/etc/conf.d/local.start,從而在每次系統啟動時載入SoundFont。

注意: 下述程式碼列表中的/mnt路徑也許和您的機器上的路徑不同。它們只是例子而已,您需要根據您的機器改變路徑。

程式碼 4.2: 載入Soundfonts

(首先,複製Soundfont)cp /mnt/win2k/Program\ Files/CreativeSBLive2k/SFBank/8MBGMSFX.SF2 /usr/share/sounds/sf2/ 
(或者從SoundBlaster的光盤裡複製檔案)cp /mnt/cdrom/AUDIO/ENGLISH/SFBANK/8MBGMSFX.SF2 /usr/share/sounds/sf2/
(載入特定的Soundfont)asfxload /usr/share/sounds/sf2/8MBGMSFX.SF2

您現在可以用aplaymidi這樣的程式來播放midi檔案。執行aplaymidi -l來獲取埠列表,然後選擇一個埠來播放。

程式碼 4.3: 播放MIDI

(檢視可用的埠)aplaymidi -l
Port Client name Port name
64:0 EMU10K1 MPU-401 (UART) EMU10K1 MPU-401 (UART)
65:0 Emu10k1 WaveTable Emu10k1 Port 0
65:1 Emu10k1 WaveTable Emu10k1 Port 1
65:2 Emu10k1 WaveTable Emu10k1 Port 2
65:3 Emu10k1 WaveTable Emu10k1 Port 3
(選擇一個埠,播放mid檔案)aplaymidi --port=65:0 /mnt/shyam/music/midi/mi2.mid

虛擬合成器

如果您的音效卡不支援硬體合成器,您可以使用虛擬合成器,比如timidity++。安裝是小菜一碟。

程式碼 4.4: 安裝timidity++

emerge timidity++

timidity需要一個SoundFont來播放聲音。幸運的是ebuild會為您安裝一些SoundFont。Portage裡還有一些可用的SountFont包,比如timidity-freepatstimidity-eawpatches。您可以安裝多個SountFont包,而且可以在/usr/share/timidity/安裝您自己的SoundFont檔案。要在多個timidity的配置中選擇,您需要eselect

程式碼 4.5: 改變配置

eselect timidity listeselect timidity set eawpatches

不要忘了把timidity加入預設執行級。

程式碼 4.6: 把timidity加入預設執行級。

rc-update add timidity default/etc/init.d/timidity start

您現在可以試著播放MIDI檔案。

工具和韌體

某些特定音效卡可以從alsa-toolsalsa-firmware包中獲得性能的提升。您只需要簡單的emerge

程式碼 4.7: 安裝ALSA工具

emerge alsa-tools

如果ALSA被編譯為核心模組,您可以同時在您的系統中使用多塊音效卡。您僅需要在/etc/modules.d/alsa裡指定啟動的順序。此檔案用驅動名來標記您的音效卡。0是第一塊卡,1是第二塊卡,以此類推。這是一個有兩塊音效卡系統的例子。

程式碼 4.8: 兩塊音效卡的/etc/modules.d/alsa配置

options snd-emu10k1 index=0
options snd-via82xx index=1

如果您有兩塊音效卡使用相同的驅動,您在同一行裡用逗號分隔的數字來配置它們。這是一個有三塊音效卡的系統,其中的兩塊是Intel高保真音效卡。

程式碼 4.9: 多塊音效卡的/etc/modules.d/alsa配置

options snd-ymfpci index=0
options snd-hda-intel index=1,2

外掛

您也許想安裝一些外掛來獲得額外的功能。alsa-plugins打包提供了一些有用的外掛,包括: PulseAudio輸出,取樣率轉換器;jack(一個低延遲的音訊伺服器)和一個可以通過數字S/PDIF介面(光線或同軸電纜)輸出6聲道音訊的編碼器。您可以通過USE標記來選擇安裝什麼外掛

程式碼 4.10: 安裝alsa-plugins

emerge -avt alsa-plugins

感謝

所有Gentoo ALSA指南的貢獻者: Vincent Verleye, Grant Goodyear, Arcady Genkin, Jeremy Huddleston, John P. Davis, Sven Vermeulen, Benny Chuang, Tiemo Kieft and Erwin。