這一節回答經常在Usenet討論區及通信論壇常被問到的問題.
可以在OSS音效驅動程式的網站看到更多問題的解答.
以下是最``標準''的設備檔檔名, 雖然有些Linux套件可能用不太一樣的名稱.
一般是連到 /dev/audio0
和Sun工作站相容的聲訊設備 (只作了部份, 並不支援Sun的ioctl 介面, 只有u-law編碼)
第二個音訊設備 (如果音效卡支援, 或不只有一張音效卡的話)
一般連到 /dev/dsp0
第壹數位取樣設備
第貳數位取樣設備
通常連結到 /dev/mixer0
第壹混音器
第貳混音器
高階編曲器介面
低階MIDI, FM, 及GUS存取用
通常連結到 /dev/music
第壹原生(raw)MIDI埠
第貳原生MIDI埠
第參原生MIDI埠
第肆原生MIDI埠
讀取時, 顯示音效驅動程式的狀態
PC喇叭驅動程式提供以下設備:
和/dev/audio同樣
和/dev/dsp一樣
和/dev/mixer一樣
Sun工作站的音效檔(.au)可以丟到/dev/audio
來放出, 原始取樣檔可以丟到
/dev/dsp
, 雖然這樣一般來說會產生很差的輸出. 使用像play
這樣的
程式比較好, 而且還能辨別音效檔格式, 設定正確的取樣率等.
像wavplay或vplay(在snd-util套件中)的程式, 給它WAV檔會產生最佳結果. 然而它們無法 辨識Microsoft ADPCM壓縮過的WAV檔. 同時, 舊版的play(在Lsox套件中)對16位元的WAV檔 處理並不好.
在snd-util中的splay命令如果以手動輸入適切的參數, 可以用來播放多數音效檔.
可以從/dev/audio
或/dev/dsp
中讀取取樣過的資料, 可以轉向到檔案
去. 像vrec
這樣的程式可以較簡單地控制取樣率及時間等. 你也需要混音器,
以便選擇想要的輸入來源.
現在的音效驅動程式允許你裝好幾片聲霸卡, 聲霸卡Pro, 聲霸卡16, MPU-401 或MSS卡. 裝兩片聲霸卡是可能的, 不過要手動編輯 local.h, 定義SB2_BASE, SB2_IRQ, SB2_DMA 及 SB2_DMA2(有些情形下才要). 也可以同時裝一片聲霸卡及一片PAS16.
若是你用make config來設定較新的2.0.x版核心的音效的話, 你應該編輯/usr/include/linux/autoconf.h
而非local.h
. 你會看到幾行:
#define SBC_BASE 0x220
#define SBC_IRQ (5)
#define SBC_DMA (1)
#define SB_DMA2 (6)
#define SB_MPU_BASE 0x0
#define SB_MPU_IRQ (-1)
在它們後面加入幾行(數值依照你的系統設定)
#define SB2_BASE 0x330
#define SB2_IRQ (7)
#define SB2_DMA (2)
#define SB2_DMA2 (2)
以下驅動程式不准你裝兩片卡:
要建立設備檔啊! 請參見前面建立設備檔的部份. 如果你確實有設備檔, 檢查主編號及次 編號是否正確. (一些舊一點的CD-ROM Linux套餐可能不會在安裝時建立正確的設備檔)
你的核心並不支援音效驅動程式, 或是I/O位址設定和硬體不一致. 檢查你是否用新造的 核心開機, 並確認其設定和硬體是一致的.
如果你沒有建立必要的設備檔, 然後把音效檔朝/dev/audio或/dev/dsp丟, 就會發生這種 情況. 這時這些``設備檔''其實只是普通檔案, 而且把你的磁碟塞滿了. 你必 須照本文件中建立設備檔這一小節的指引去執行那個script.
在Linux 2.0或之後, 當設備開啟, 系統卻沒有足夠的RAM時亦會發生. 對每個DMA通道, 音效驅動程式至少需要兩頁(8K)連續記憶體區塊. 這種情型在不足16M的RAM或已經啟動很 久的系統上可能發生. 要清出一些RAM, 在再開啟設備檔以前, 先編譯及執行以下的C程式 也許可行.
main() {
int i;
char mem[500000];
for (i = 0; i < 500000; i++)
mem[i] = 0;
exit(0);
}
一個音效設備一次只能給一個程序用. 問題中, 最可能就是有別的程序正在使用這個設
備. 確定的方法之一是用fuser
命令:
% fuser -v /dev/dsp
/dev/dsp: USER PID ACCESS COMMAND
tranter 265 f.... tracker
在上例中, fuser命令顯示265號程序開啟了該設備. 可以選擇等它做完或把它砍掉, 這樣
它就又能使用了. 你應該以root身份執行fuser
命令, 這樣才會列出除了你以外
的使用者.
根據Brian Gough的說法, 使用一號DMA通道的聲霸卡會和同樣也佔用DMA 1的QIC-02磁帶機 驅動程式相衝, 造成``device busy''錯誤. 如果您使用FTAPE, 您可能有加進 這個驅動程式. 根據FTAPE-HOWTO, QIC-02驅動程式在使用FTAPE上不是必要的; 只有 QIC-117才必要. 重造核心, 使用QIC-117驅動程式, 取消QIC-02, 這樣FTAPE及音效驅動程 式就能共存了.
這種症狀, 通常是先播放一秒左右, 然後完全停止, 或印出``missing IRQ'' 或``DMA timeout''訊息. 八成是您的IRQ或DMA設錯了. 核對一下, 您在核心中 的設定是不是和硬體跳線的一樣, 而且並沒有和別的卡相衝.
另一種症狀是聲音一直重覆. 這通常導因於IRQ衝突.
要播放MOD檔, 需要可觀的CPU能力. 您可能跑太多程式導致系統反應過慢, 無法及時放 音. 有下面幾種解法:
如果您有用Gravis UltraSound音效卡, 您應該使用專為GUS設計的MOD播放程式
(如 gmod
)
1.0c版以後和以前的音效驅動程式用完全不同且不相容的ioctl()
方式. 抓新版
的原始碼, 或做必要改變, 把它移執到適合新版驅動程式用. 詳見音效驅動程式的
Readme
檔.
也請確定編譯應用程式時, 您使用最新的soundcard.h
及ultrasound.h
.
請見本文開頭處裡的安裝指引.
這和上個問題可能是一樣的.
看音效程式裡附的Readme
及CHANGELOG
檔.
它們有一部份放在現在以草案型式存在的Hacker's Guide to VoxWare. 最新版是第二草案, 可在 ftp://nic.funet.fi/pub/OS/Linux/ALPHA/sound 中找到. 注意這目錄是``隱藏的'', 不會在目錄列表出現. 如果您``cd'' 進去再``dir''就可以發現這些檔案.
在寫這篇時, 新文件已經可以在4Front Techonlogies的網站上看到了.
另一個來源就是Linux Multimedia Guide, 在參考資料那節有講.
這問題不好回答, 它取決於:
一般來說, 任何386機器應該都可以在8位元音效卡上播放音效, 或用FM合成放 音樂.
然而, 放MOD檔需要可觀的CPU資源. 一些實驗性的測量顯示, 要以44KHz播放,要消耗一顆 486/50 CPU的 40% 能力; 386/25幾乎不可能放比22KHz 更高的取樣率.(以8位元音效卡, 如聲霸卡, 所測得)一些像Gravis UltraSound的卡硬體提供更多功能, 需要的CPU資源就 較少.
這些是假設電腦沒有在跑其它耗CPU能力的工作.
如果您的電腦有數學輔助處理器(或CPU內部有FPU), 用像sox
這樣的程式做
音效轉換或增加效果會快不少. 雖然核心驅動程式本身是沒有用到浮點運算啦.
(以下解釋由seeker@indirect.com
提供)
Linux只能認出在330(預設值)或334位址上的1542, 而PAS只能將MPU-401模擬設在 330. 即使你用軟體消去MPU-401, 如果有東西還在這個預設位址上, 仍然會和1542 相衝. 把1542移到334就什麼都解決了.
另外, 1542和PAS-16都有用到16位元DMA, 所以如果你一面以16位元, 44KHz立體聲 錄音, 一面將檔案存到掛在1542上的硬碟的話, 麻煩就來了. DMA會重疊, 導致RAM沒有 時間充電, 然後就會出現 "PARITY ERROR - SYSTEM HALTED" 的訊息, 您 甚至還來不及知道怎麼當的. 更糟糕的是有些QIC-117磁帶的協力廠商建議設定匯流排 開/關時間, 使1542佔匯流排更久. 從Adaptec的BBS或Internet的其它地方抓 SCSISEL.EXE 程式, 減少BUS ON時間或增加BUS OFF時間, 直到這問題完全消失. SCSISEL 會改變 EEPROM 的設定, 所以比在CONFIG.SYS中載入的DOS驅動程式效力更 持久, 開機就直接進Linux也有效(不像DOS修補). 又解決了一個問題.
最後一個問題 - 舊的Symphony晶片組劇烈地降低I/O周期時間, 加快匯流排存取. 我所玩過的各種卡中, 除了PAS-16以外, 沒有一片卡有出現過任何問題. Media Vision的BBS有個SYMPFIX.EXE可以將Symphony的匯流排控制器的診斷位元調整, 治好這種證狀, 但這並不能算有力的保證. 您也許要:
Young Microsystems願意以$30(美金)的代價為他們製的板子升級; 如果您能講出誰製的或 誰進口的板子, 別的廠商也可能會這樣(祝你好運). 據我所知這問題出於ProAudio的匯流 排介面晶片; 沒有人會花$120買音效卡, 然後把它插在6MHz的AT上. 多數人會升 級到25-40MHz的386/486, 而如果設計正確, 至少能承受12MHz以上的匯流排頻率. 講完了, 下台一鞠躬.
第一個問題和你的主機板晶片組, 匯流排速率, 及其它BIOS設定, 還有月亮的圓缺有關.(?) 第二個問題牽涉到您的記憶體充電方式 (隱藏式或同步式), 1542 DMA 頻率及匯流排I/O速 率(可能有關). 第三個問題, 可以打電話到Media Vision, 問他們哪些Symphony晶片組的 慢速設計和他們的卡不相容. 在此警告一下, 我問過的四位``工程師''中, 就 有三個頭殼壞去. 聽他們講別人的硬體講得啥一樣, 其實他們甚至連自己的都搞不清楚.
譯注: 這一段可能和原文意思差很多, 有建議請不吝提供.
受限於硬體, 在多數音效卡上是不可能的. 一些新卡能支援這功能. 請看在 Hacker's Guide to Voxware中的"bidirectional mode"這一節.
在'286及以後的機器, IRQ2中斷連接了第二個中斷控制器. 它等同於IRQ 9.
在過去, Creative Labs很不願意為這些卡出版程式設計資訊. 現在他們已經改變策略, 而在2.1.x核心中也包含了AWE驅動程式了.
這在暖開機進DOS後發生. 有時錯誤訊息會誤導您, 以為是CONFIG.SYS檔哪裡 寫錯了.
多數現在的音效卡有軟體設定的IRQ及DMA設定. 如果您的卡在Linux下及MSDOS/Windows 下設定值不一樣的話, 可能會造成問題. 有些音效卡不准設新參數, 除非完全 reset. (如把電源關掉再打開, 或使用硬體上的reset鈕)
簡單對付方法就是按下reset鍵, 或把開關關了再開, 不要用暖開機(即 Ctrl-Alt-Del).
正解則是確保您在MS-DOS及Linux下都用同樣的IRQ及DMA設定 (或乾脆不要用DOS :-).
想玩ID software出的DOOM遊戲之Linux版的玩家們, 可能對這個有興趣.
要正確的音效輸出, 您必需使用2.90版或以後的音效驅動程式; 它支援了即時的 ``DOOM模式''.
音效樣本是16 bit. 如果您用8 bit音效卡, 您仍然可以用一些可在 ftp://sunsite.unc/edu/pub/Linux/games/doom中找到的一些程式, 讓聲音 出現.
如果DOOM動作不流暢, 把音效取消(把sndserver
檔改名)會有一些改進.
DOOM預設不支援音樂(如同DOS版). musserver
程式將增加Linux下的
音樂支援. 它可以在
ftp://pandora.st.hmc.edu/pub/linux/musserver.tgz
中找到.
用高品質的屏蔽電纜, 換個插槽插, 可能有助於減低雜音. 如果音效卡有音量調整鈕, 您 可以試試不同的設定(通常最大聲最好)
您可以用混音程式, 將不想要的輸入(如麥克風)調成無增益
有些音效卡偷工減料, 沒有好的遮蔽及接地, 容易產生雜音
最後, 在我的電腦上, 我發現核心命令列有個選項no-hlt
可以降低雜訊. 這個選
項叫核心在跑閒置迴圈時不要用HLT指令. 您可以開機時手動試試, 或在LILO設定檔中加上
append="no-hlt"
如果您能放音, 卻不能錄音, 試試:
有時錄音及放音用的DMA通道是不同的. 這種情況下八成是錄音用DMA設定不對.
多數情況下, ``聲霸卡相容''卡在Linux下若捨聲霸卡驅動程式不用而改用 別的驅動程式, 會更好用. 多數號稱相容(如``16位元SB Pro相容''或SB相容的 ``16位元'')的卡, 它的聲霸卡相容模式是提供DOS遊戲的相容性所做的. 多數卡有可能 被最近的Linux(2.0.1以後)支援的, 自身的16位元模式.
只有一些(通常很舊)的卡必須嘗試用聲霸卡模式運作. 新卡中只有一個例外, 那就是用 Mwave為主的卡.
號稱和聲霸卡相容的16位元音效卡其實只和8位元的聲霸卡Pro相容而已. 它們有和聲霸卡 16不相容的16位元模式, 和Linux音效驅動程式不相容.
也許改用MAD16或MSS/WSS驅動程式後, 您就能用16位元模式了.
這裡有一些好的檔案庫, 可以搜尋Linux專用的音效應用軟體:
最新的核心裡的音效驅動程式可以做成可載入模組.
詳情請參考:/usr/src/linux/drivers/sound/Readme.modules
及/usr/src/linux/Documentation/modules.txt
(或/usr/src/linux/README
)
試試oplbeep
程式, 可在
ftp://sunsite.unc.edu/pub/Linux/apps/sound/oplbeep-alpha.tar.gz
中找到.
另一個變種, 叫beep
程式, 可在
ftp://sunsite.unc.edu/pub/Linux/kernel/patches/misc/modreq_beep.tgz
中找到.
modutils
套件有個範例程式及核心修補, 支援在核心要求時, 執行外部程式,
產生聲音.
另外在一些音效卡上, 您可以將PC喇叭輸出到音效卡上, 這樣所有聲音就都由音效卡 發出來了.
支援很多Intel為基台的Unix相容作業系統的核心音效驅動程式, 也可以以獨立於 Linux核心的套件取得. 在1996年二月以前, 作者稱這軟體為 ``VoxWare''. 然而不幸的, 這名稱已成了 VoxWare Incorporated的註冊商標, 不能再被使用了. 現在這個驅動程式的新名 稱叫OSS/Free.
Open Sound System(OSS)是給很多Unix系統用的, 商業版核心音效驅動程式, 由 4Front Technologies出售. 叫做 OSS/Free 的免費版本將繼續在Linux系統上以免費型式存在.
更多資訊可在4Front Technologies網站(在 http://www.4front-tech.com/) 上看到.
同一個東西, 您可能有聽過的名稱還有TASD(暫時的無名音效驅動程式)及USS (Unix音效系統)
欲取得更多資訊, 請見4Front Technologies的網頁, 在 http://www.4front-tech.com/. 我在1997年六月的 Linux Journal有寫過OSS/Linux的評論文章.
到了Linux 2.1版後應該能完全支援隨插即用. 現在要讓隨插即用音效卡能用, 還有不少 要做的.
如果您用有Plug and Play BIOS的新Pentium機器, 要小心設定您的卡. 確定您將核心 音效驅動程式的I/O位址, IRQ及DMA等設得和BIOS給的一樣.
給Linux用, 可用來設定這種卡的隨插即用工具是存在的. 您可以在Red Hat的網站 http://www.redhat.com/找到. 它也可能包含在您的Linux套餐中.
如果您在 Windows95 下使用這種卡, 可以用設備管理員來設定卡, 然後用LOADLIN 暖啟動進Linux. 確定 Windows95 及 Linux 使用相同的設定參數.
如果您在DOS下用這種卡, 您可以使用聲霸卡16PnP卡附的icu
公用程式, 在DOS
下設定. 然後用LOADLIN暖開機進Linux. 一樣, 確定 DOS 及 Linux 用相同的設定參數.
商業版的OSS音效驅動程式支援聲霸卡16PnP, 您可以向 4Front Technologies 購買.
在1.3.67版核心中的改變讓(錯誤的)檢查SNDCTL_DSP_GETBLKSIZE ioctl是否傳回大 於4096的放音軟體失效. 在最新的snd-util-3.x.tar.gz套件(在 ftp://ftp.4front-tech.com/ossfree 中的公用程式現已能處理這種狀況了. 最新的驅動程式也已修正, 避免配置小於4096 bytes的碎塊, 解決了舊公用程式的問題.
音效驅動程式支援很多不同的設定參數. 驅動程式中的configure
會檢查各參數間的相依性. 而核心的設定工具就沒有提供這樣的功能.
這就是說, 最新的核心部份地允許音效驅動程式使用標準核心設定工具(參見前面 ``設定核心''那一小節.)
您可以將音效驅動程式做成可載入模組, 並使用kerneld
自動載入及除去. 然而
這造成了一個問題 - 當模組重新載入時, 混音器設定又回歸預定的值. 對有些音效卡來
說, 這會太大聲(如聲霸卡16)或太小聲. Markus Gutschke
(gutschk@uni-muenster.de
)發現了這問題的解決之道, 在您的
/etc/conf.modules
檔中加入如下的一行:
options sound dma_buffsize=65536 && /usr/bin/setmixer igain 0 ogain 0 vol 75
這會在音效驅動程式載入後立刻執行您的混音程式(在範例中是用setmixer
). dma_buffsize
參數沒有意義, 但是是必需的, 因為這個命令
需要一些命令列的選項. 把上面那行改成您想要的混音及增益設定值.
如果您將音效驅動程式連進核心, 而想在開機後就自動設定音量, 您可以在開機自動執行
檔/etc/rc.d/rc.local
中將混音程式加進去.
在Readme.linux中的script, 會將音效設備檔設成僅有root
可讀, 這是為了填補
安全上的漏洞. 在網路環境裡, 外面的使用者可以遠端連進有音效卡及麥克風的Linux系統
並竊聽. 如果您不擔心這個, 您可以改變這個script中的權限.
在預設的安裝法, 一般使用者仍然可以播放音效檔. 這不會造成安全上的負擔, 反而可 以省掉很多麻煩.
關於如何在Linux下使用IBM ThinkPad上的mwave音效卡之資訊, 可在 http://www.screamin.demon.co.uk/查到.