關於核心 OSS 模擬的說明¶
Jan. 22, 2004 Takashi Iwai <tiwai@suse.de>
模組¶
ALSA 在核心上提供強大的 OSS 模擬。用於 PCM、混音器和音序器裝置的 OSS 模擬作為附加核心模組實現,分別是 snd-pcm-oss、snd-mixer-oss 和 snd-seq-oss。當您需要訪問 OSS PCM、混音器或音序器裝置時,必須載入相應的模組。
當呼叫相應的服務時,這些模組會自動載入。別名定義為 sound-service-x-y,其中 x 和 y 分別是音效卡編號和次要單元編號。通常您不必自己定義這些別名。
自動載入 OSS 模組的唯一必要步驟是在 /etc/modprobe.d/alsa.conf 中定義音效卡別名,例如:
alias sound-slot-0 snd-emu10k1
作為第二張音效卡,也定義 sound-slot-1。請注意,您不能使用別名作為目標名稱(即,像舊的 modutils 一樣,alias sound-slot-0 snd-card-0 不再有效)。
當前可用的 OSS 配置顯示在 /proc/asound/oss/sndstat 中。這顯示了與 /dev/sndstat 相同的語法,該檔案在商業 OSS 驅動程式上可用。在 ALSA 上,您可以將 /dev/sndstat 符號連結到此 proc 檔案。
請注意,此 proc 檔案中列出的裝置僅在載入相應的 OSS 模擬模組後才會顯示。即使其中顯示“NOT ENABLED IN CONFIG”,也不必擔心。
裝置對映¶
ALSA 支援以下 OSS 裝置檔案:
PCM:
/dev/dspX
/dev/adspX
Mixer:
/dev/mixerX
MIDI:
/dev/midi0X
/dev/amidi0X
Sequencer:
/dev/sequencer
/dev/sequencer2 (aka /dev/music)
其中 X 是從 0 到 7 的音效卡編號。
(注意:某些發行版具有諸如 /dev/midi0 和 /dev/midi1 之類的裝置檔案。它們不是用於 OSS,而是用於 tclmidi,這完全是另一回事。)
與真正的 OSS 不同,ALSA 不能使用超過分配的裝置檔案。例如,第一張音效卡不能使用 /dev/dsp1 或 /dev/dsp2,而只能使用 /dev/dsp0 和 /dev/adsp0。
如上所示,PCM 和 MIDI 可能有兩個裝置。通常,第一個 PCM 裝置(ALSA 中的 hw:0,0)對映到 /dev/dsp,第二個裝置(hw:0,1)對映到 /dev/adsp(如果可用)。對於 MIDI,分別是 /dev/midi 和 /dev/amidi。
您可以透過 snd-pcm-oss 和 snd-rawmidi 的模組選項更改此裝置對映。對於 PCM,以下選項可用於 snd-pcm-oss:
- dsp_map
分配給 /dev/dspX 的 PCM 裝置編號(預設 = 0)
- adsp_map
分配給 /dev/adspX 的 PCM 裝置編號(預設 = 1)
例如,要將第三個 PCM 裝置(hw:0,2)對映到 /dev/adsp0,請像這樣定義:
options snd-pcm-oss adsp_map=2
這些選項採用陣列。要配置第二張音效卡,請指定以逗號分隔的兩個條目。例如,要將第二張音效卡上的第三個 PCM 裝置對映到 /dev/adsp1,請如下定義:
options snd-pcm-oss adsp_map=0,2
要更改 MIDI 裝置的對映,以下選項可用於 snd-rawmidi:
- midi_map
分配給 /dev/midi0X 的 MIDI 裝置編號(預設 = 0)
- amidi_map
分配給 /dev/amidi0X 的 MIDI 裝置編號(預設 = 1)
例如,要將第一張音效卡上的第三個 MIDI 裝置分配給 /dev/midi00,請如下定義:
options snd-rawmidi midi_map=2
PCM 模式¶
預設情況下,ALSA 使用所謂的外掛層模擬 OSS PCM,即,當音效卡本身不支援時,嘗試自動轉換取樣格式、速率或通道。對於諸如 quake 或 wine 之類的一些應用程式,這將導致一些問題,尤其是當它們僅在 MMAP 模式下使用音效卡時。
在這種情況下,您可以透過向 proc 檔案寫入命令來更改每個應用程式的 PCM 行為。每個 PCM 流都有一個 proc 檔案,/proc/asound/cardX/pcmY[cp]/oss,其中 X 是音效卡編號(從零開始),Y 是 PCM 裝置編號(從零開始),p 用於播放,c 用於捕獲。請注意,此 proc 檔案僅在載入 snd-pcm-oss 模組後才存在。
命令序列具有以下語法:
app_name fragments fragment_size [options]
app_name 是應用程式的名稱,帶有(更高優先順序)或不帶有路徑。fragments 指定分段的數量,如果未給出特定數量,則指定為零。fragment_size 是分段的大小(以位元組為單位),如果未給出,則為零。options 是可選引數。以下選項可用:
- disable
應用程式嘗試為此通道開啟一個 pcm 裝置,但不想使用它。
- direct
不使用外掛
- block
強制阻塞開啟模式
- non-block
強制非阻塞開啟模式
- partial-frag
也寫入部分片段(僅影響播放)
- no-silence
不要提前填充靜音以避免咔噠聲
當應用程式本身不支援兩個方向時,disable 選項在應用程式未正確處理一個流方向(播放或捕獲)時非常有用。如上所述,direct 選項用於繞過自動轉換,並且對 MMAP 應用程式很有用。例如,要為 quake 無外掛地播放第一個 PCM 裝置,請透過 echo 傳送如下命令:
% echo "quake 0 0 direct" > /proc/asound/card0/pcm0p/oss
雖然 quake 只需要播放,但您可以附加第二個命令以通知驅動程式即將分配此方向:
% echo "quake 0 0 disable" > /proc/asound/card0/pcm0c/oss
proc 檔案的許可權取決於 snd 的模組選項。預設情況下,它設定為 root,因此您可能需要成為超級使用者才能傳送上述命令。
block 和 non-block 選項用於更改開啟裝置檔案的行為。
預設情況下,ALSA 的行為與原始 OSS 驅動程式相同,即,當檔案繁忙時不阻塞檔案。在這種情況下,返回 -EBUSY 錯誤。
可以透過 snd-pcm-oss 的 nonblock_open 模組選項全域性更改此阻塞行為。要為 OSS 裝置預設使用阻塞模式,請如下定義:
options snd-pcm-oss nonblock_open=0
partial-frag 和 no-silence 命令是最近新增的。這兩個命令僅用於最佳化。前者指定僅在填充整個片段時才呼叫寫入傳輸。後者停止自動提前寫入靜音資料。預設情況下,兩者均已停用。
您可以透過讀取 proc 檔案來檢查當前定義的配置。讀取的影像可以再次傳送到 proc 檔案,因此您可以儲存當前配置:
% cat /proc/asound/card0/pcm0p/oss > /somewhere/oss-cfg
並像這樣恢復它:
% cat /somewhere/oss-cfg > /proc/asound/card0/pcm0p/oss
此外,為了清除所有當前配置,請傳送如下所示的 erase 命令:
% echo "erase" > /proc/asound/card0/pcm0p/oss
混音器元素¶
由於 ALSA 具有完全不同的混音器介面,因此 OSS 混音器的模擬相對複雜。ALSA 基於名稱字串從幾個不同的 ALSA(混音器)控制元件構建混音器元素。例如,音量元素 SOUND_MIXER_PCM 由“PCM Playback Volume”和“PCM Playback Switch”控制元件組成,用於播放方向,由“PCM Capture Volume”和“PCM Capture Switch”組成,用於捕獲目錄(如果存在)。當 OSS 的 PCM 音量更改時,會自動調整上述所有音量和開關控制元件。
預設情況下,ALSA 使用以下控制元件進行 OSS 音量控制:
OSS 音量 |
ALSA 控制元件 |
索引 |
|---|---|---|
SOUND_MIXER_VOLUME |
主音量 |
0 |
SOUND_MIXER_BASS |
音調控制 - 低音 |
0 |
SOUND_MIXER_TREBLE |
音調控制 - 高音 |
0 |
SOUND_MIXER_SYNTH |
合成器 |
0 |
SOUND_MIXER_PCM |
PCM |
0 |
SOUND_MIXER_SPEAKER |
PC 揚聲器 |
0 |
SOUND_MIXER_LINE |
線路 |
0 |
SOUND_MIXER_MIC |
麥克風 |
0 |
SOUND_MIXER_CD |
CD |
0 |
SOUND_MIXER_IMIX |
監聽混音 |
0 |
SOUND_MIXER_ALTPCM |
PCM |
1 |
SOUND_MIXER_RECLEV |
(未分配) |
|
SOUND_MIXER_IGAIN |
捕獲 |
0 |
SOUND_MIXER_OGAIN |
播放 |
0 |
SOUND_MIXER_LINE1 |
輔助 |
0 |
SOUND_MIXER_LINE2 |
輔助 |
1 |
SOUND_MIXER_LINE3 |
輔助 |
2 |
SOUND_MIXER_DIGITAL1 |
數字 |
0 |
SOUND_MIXER_DIGITAL2 |
數字 |
1 |
SOUND_MIXER_DIGITAL3 |
數字 |
2 |
SOUND_MIXER_PHONEIN |
電話 |
0 |
SOUND_MIXER_PHONEOUT |
電話 |
1 |
SOUND_MIXER_VIDEO |
影片 |
0 |
SOUND_MIXER_RADIO |
收音機 |
0 |
SOUND_MIXER_MONITOR |
監聽 |
0 |
第二列是相應 ALSA 控制元件的基本字串。實際上,還會檢查帶有 XXX [Playback|Capture] [Volume|Switch] 的控制元件。
這些混音器元素的當前分配列在 proc 檔案 /proc/asound/cardX/oss_mixer 中,該檔案類似於以下內容:
VOLUME "Master" 0
BASS "" 0
TREBLE "" 0
SYNTH "" 0
PCM "PCM" 0
...
其中第一列是 OSS 音量元素,第二列是相應 ALSA 控制元件的基本字串,第三列是控制元件索引。當字串為空時,表示相應的 OSS 控制元件不可用。
要更改分配,您可以將配置寫入此 proc 檔案。例如,要將“Wave Playback”對映到 PCM 音量,請傳送如下命令:
% echo 'VOLUME "Wave Playback" 0' > /proc/asound/card0/oss_mixer
該命令與 proc 檔案中列出的命令完全相同。您可以更改一個或多個元素,每行一個音量。在最後一個示例中,更改 PCM 音量時,將同時影響“Wave Playback Volume”和“Wave Playback Switch”。
與 PCM proc 檔案的情況一樣,proc 檔案的許可權取決於 snd 的模組選項。您可能需要成為超級使用者才能傳送上述命令。
與 PCM proc 檔案的情況一樣,您可以透過讀取和寫入整個檔案影像來儲存和恢復當前混音器配置。
雙工流¶
請注意,當嘗試將單個裝置檔案用於播放和捕獲時,OSS API 無法設定每個方向上不同的格式、取樣率或通道數。因此
io_handle = open("device", O_RDWR)
僅當每個方向上的值相同時才能正常執行。
要在兩個方向上使用不同的值,請同時使用
input_handle = open("device", O_RDONLY)
output_handle = open("device", O_WRONLY)
併為相應的控制代碼設定值。
不支援的功能¶
ICE1712 驅動程式上的 MMAP¶
ICE1712 僅支援非常規格式,即交錯的 10 通道 24 位(打包在 32 位中)格式。因此,您無法以傳統的(單聲道或 2 通道,8 或 16 位)格式在 OSS 上 mmap 緩衝區。