關於核心 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-fragno-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 緩衝區。