Next Previous Contents

6. 常見問題與解答

這一節回答經常在Usenet討論區及通信論壇常被問到的問題.

可以在OSS音效驅動程式的網站看到更多問題的解答.

6.1 這一堆音效設備檔各代表什麼?

以下是最``標準''的設備檔檔名, 雖然有些Linux套件可能用不太一樣的名稱.

/dev/audio

一般是連到 /dev/audio0

/dev/audio0

和Sun工作站相容的聲訊設備 (只作了部份, 並不支援Sun的ioctl 介面, 只有u-law編碼)

/dev/audio1

第二個音訊設備 (如果音效卡支援, 或不只有一張音效卡的話)

/dev/dsp

一般連到 /dev/dsp0

/dev/dsp0

第壹數位取樣設備

/dev/dsp1

第貳數位取樣設備

/dev/mixer

通常連結到 /dev/mixer0

/dev/mixer0

第壹混音器

/dev/mixer1

第貳混音器

/dev/music

高階編曲器介面

/dev/sequencer

低階MIDI, FM, 及GUS存取用

/dev/sequencer2

通常連結到 /dev/music

/dev/midi00

第壹原生(raw)MIDI埠

/dev/midi01

第貳原生MIDI埠

/dev/midi02

第參原生MIDI埠

/dev/midi03

第肆原生MIDI埠

/dev/sndstat

讀取時, 顯示音效驅動程式的狀態

PC喇叭驅動程式提供以下設備:

/dev/pcaudio

和/dev/audio同樣

/dev/pcsp

和/dev/dsp一樣

/dev/pcmixer

和/dev/mixer一樣

6.2 怎樣播放音效檔案?

Sun工作站的音效檔(.au)可以丟到/dev/audio來放出, 原始取樣檔可以丟到 /dev/dsp, 雖然這樣一般來說會產生很差的輸出. 使用像play這樣的 程式比較好, 而且還能辨別音效檔格式, 設定正確的取樣率等.

像wavplay或vplay(在snd-util套件中)的程式, 給它WAV檔會產生最佳結果. 然而它們無法 辨識Microsoft ADPCM壓縮過的WAV檔. 同時, 舊版的play(在Lsox套件中)對16位元的WAV檔 處理並不好.

在snd-util中的splay命令如果以手動輸入適切的參數, 可以用來播放多數音效檔.

6.3 怎樣錄製音效檔?

可以從/dev/audio/dev/dsp中讀取取樣過的資料, 可以轉向到檔案 去. 像vrec這樣的程式可以較簡單地控制取樣率及時間等. 你也需要混音器, 以便選擇想要的輸入來源.

6.4 我可以有不只一片音效卡嗎?

現在的音效驅動程式允許你裝好幾片聲霸卡, 聲霸卡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)

以下驅動程式不准你裝兩片卡:

6.5 錯誤: No such file or directory for sound devices

要建立設備檔啊! 請參見前面建立設備檔的部份. 如果你確實有設備檔, 檢查主編號及次 編號是否正確. (一些舊一點的CD-ROM Linux套餐可能不會在安裝時建立正確的設備檔)

6.6 錯誤: No such device for sound devices

你的核心並不支援音效驅動程式, 或是I/O位址設定和硬體不一致. 檢查你是否用新造的 核心開機, 並確認其設定和硬體是一致的.

6.7 錯誤: No space left on device for sound devices

如果你沒有建立必要的設備檔, 然後把音效檔朝/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);
}

6.8 錯誤: Device busy for sound devices

一個音效設備一次只能給一個程序用. 問題中, 最可能就是有別的程序正在使用這個設 備. 確定的方法之一是用fuser命令:

% fuser -v /dev/dsp
/dev/dsp:             USER       PID ACCESS COMMAND
                      tranter    265 f....  tracker

在上例中, fuser命令顯示265號程序開啟了該設備. 可以選擇等它做完或把它砍掉, 這樣 它就又能使用了. 你應該以root身份執行fuser命令, 這樣才會列出除了你以外 的使用者.

6.9 還是逃不了'device busy'的錯誤!

根據Brian Gough的說法, 使用一號DMA通道的聲霸卡會和同樣也佔用DMA 1的QIC-02磁帶機 驅動程式相衝, 造成``device busy''錯誤. 如果您使用FTAPE, 您可能有加進 這個驅動程式. 根據FTAPE-HOWTO, QIC-02驅動程式在使用FTAPE上不是必要的; 只有 QIC-117才必要. 重造核心, 使用QIC-117驅動程式, 取消QIC-02, 這樣FTAPE及音效驅動程 式就能共存了.

6.10 音效檔放到一半就停了

這種症狀, 通常是先播放一秒左右, 然後完全停止, 或印出``missing IRQ'' 或``DMA timeout''訊息. 八成是您的IRQ或DMA設錯了. 核對一下, 您在核心中 的設定是不是和硬體跳線的一樣, 而且並沒有和別的卡相衝.

另一種症狀是聲音一直重覆. 這通常導因於IRQ衝突.

6.11 播放MOD檔斷斷續續

要播放MOD檔, 需要可觀的CPU能力. 您可能跑太多程式導致系統反應過慢, 無法及時放 音. 有下面幾種解法:

如果您有用Gravis UltraSound音效卡, 您應該使用專為GUS設計的MOD播放程式 (如 gmod)

6.12 編譯音效軟體時出錯

1.0c版以後和以前的音效驅動程式用完全不同且不相容的ioctl()方式. 抓新版 的原始碼, 或做必要改變, 把它移執到適合新版驅動程式用. 詳見音效驅動程式的 Readme檔.

也請確定編譯應用程式時, 您使用最新的soundcard.hultrasound.h. 請見本文開頭處裡的安裝指引.

6.13 以前跑很好的軟體, 卻出現SEGV錯誤

這和上個問題可能是一樣的.

6.14 音效驅動程式有何已知的限制及bug?

看音效程式裡附的ReadmeCHANGELOG檔.

6.15 關於音效驅動程式的ioctl等, 哪裡有記載?

它們有一部份放在現在以草案型式存在的Hacker's Guide to VoxWare. 最新版是第二草案, 可在 ftp://nic.funet.fi/pub/OS/Linux/ALPHA/sound 中找到. 注意這目錄是``隱藏的'', 不會在目錄列表出現. 如果您``cd'' 進去再``dir''就可以發現這些檔案.

在寫這篇時, 新文件已經可以在4Front Techonlogies的網站上看到了.

另一個來源就是Linux Multimedia Guide, 在參考資料那節有講.

6.16 要完全平順地錄放音, 需要多強的CPU才能辦到?

這問題不好回答, 它取決於:

一般來說, 任何386機器應該都可以在8位元音效卡上播放音效, 或用FM合成放 音樂.

然而, 放MOD檔需要可觀的CPU資源. 一些實驗性的測量顯示, 要以44KHz播放,要消耗一顆 486/50 CPU的 40% 能力; 386/25幾乎不可能放比22KHz 更高的取樣率.(以8位元音效卡, 如聲霸卡, 所測得)一些像Gravis UltraSound的卡硬體提供更多功能, 需要的CPU資源就 較少.

這些是假設電腦沒有在跑其它耗CPU能力的工作.

如果您的電腦有數學輔助處理器(或CPU內部有FPU), 用像sox這樣的程式做 音效轉換或增加效果會快不少. 雖然核心驅動程式本身是沒有用到浮點運算啦.

6.17 PAS16和Adaptec 1542 SCSI卡的搭配問題

(以下解釋由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晶片組的 慢速設計和他們的卡不相容. 在此警告一下, 我問過的四位``工程師''中, 就 有三個頭殼壞去. 聽他們講別人的硬體講得啥一樣, 其實他們甚至連自己的都搞不清楚.

譯注: 這一段可能和原文意思差很多, 有建議請不吝提供.

6.18 可不可以同時錄放音?

受限於硬體, 在多數音效卡上是不可能的. 一些新卡能支援這功能. 請看在 Hacker's Guide to Voxware中的"bidirectional mode"這一節.

6.19 我的聲霸卡16是設IRQ 2, 可是驅動程式不准我設這個值

在'286及以後的機器, IRQ2中斷連接了第二個中斷控制器. 它等同於IRQ 9.

6.20 聲霸卡AWE32及聲霸卡16ASP有支援嗎?

在過去, Creative Labs很不願意為這些卡出版程式設計資訊. 現在他們已經改變策略, 而在2.1.x核心中也包含了AWE驅動程式了.

6.21 我離開Linux, 起動DOS, 然後有些軟體發聲不正常

這在暖開機進DOS後發生. 有時錯誤訊息會誤導您, 以為是CONFIG.SYS檔哪裡 寫錯了.

多數現在的音效卡有軟體設定的IRQ及DMA設定. 如果您的卡在Linux下及MSDOS/Windows 下設定值不一樣的話, 可能會造成問題. 有些音效卡不准設新參數, 除非完全 reset. (如把電源關掉再打開, 或使用硬體上的reset鈕)

簡單對付方法就是按下reset鍵, 或把開關關了再開, 不要用暖開機(即 Ctrl-Alt-Del).

正解則是確保您在MS-DOS及Linux下都用同樣的IRQ及DMA設定 (或乾脆不要用DOS :-).

6.22 在Linux下跑DOOM出問題

想玩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 中找到.

6.23 怎樣降低音效卡產生的雜音?

用高品質的屏蔽電纜, 換個插槽插, 可能有助於減低雜音. 如果音效卡有音量調整鈕, 您 可以試試不同的設定(通常最大聲最好)

您可以用混音程式, 將不想要的輸入(如麥克風)調成無增益

有些音效卡偷工減料, 沒有好的遮蔽及接地, 容易產生雜音

最後, 在我的電腦上, 我發現核心命令列有個選項no-hlt可以降低雜訊. 這個選 項叫核心在跑閒置迴圈時不要用HLT指令. 您可以開機時手動試試, 或在LILO設定檔中加上 append="no-hlt"

6.24 能放音, 不能錄音

如果您能放音, 卻不能錄音, 試試:

有時錄音及放音用的DMA通道是不同的. 這種情況下八成是錄音用DMA設定不對.

6.25 必須先進DOS跑驅動程式, 不然我的"相容卡"沒法用

多數情況下, ``聲霸卡相容''卡在Linux下若捨聲霸卡驅動程式不用而改用 別的驅動程式, 會更好用. 多數號稱相容(如``16位元SB Pro相容''或SB相容的 ``16位元'')的卡, 它的聲霸卡相容模式是提供DOS遊戲的相容性所做的. 多數卡有可能 被最近的Linux(2.0.1以後)支援的, 自身的16位元模式.

只有一些(通常很舊)的卡必須嘗試用聲霸卡模式運作. 新卡中只有一個例外, 那就是用 Mwave為主的卡.

6.26 我的16位元聲霸卡相容卡在Linux下只能用8位元模式

號稱和聲霸卡相容的16位元音效卡其實只和8位元的聲霸卡Pro相容而已. 它們有和聲霸卡 16不相容的16位元模式, 和Linux音效驅動程式不相容.

也許改用MAD16或MSS/WSS驅動程式後, 您就能用16位元模式了.

6.27 在哪裡找得到Linux的音效軟體?

這裡有一些好的檔案庫, 可以搜尋Linux專用的音效應用軟體:

6.28 音效驅動程式可不可以編譯成可載入模組?

最新的核心裡的音效驅動程式可以做成可載入模組.

詳情請參考:/usr/src/linux/drivers/sound/Readme.modules/usr/src/linux/Documentation/modules.txt(或/usr/src/linux/README)

6.29 我能把主控台的嗶嗶聲改用音效卡發出嗎?

試試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喇叭輸出到音效卡上, 這樣所有聲音就都由音效卡 發出來了.

6.30 VoxWare是什麼?

支援很多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的評論文章.

6.31 有支援隨插即用音效卡嗎?

到了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 購買.

6.32 Sox/Play/Vplay 回報 "invalid block size 1024"

在1.3.67版核心中的改變讓(錯誤的)檢查SNDCTL_DSP_GETBLKSIZE ioctl是否傳回大 於4096的放音軟體失效. 在最新的snd-util-3.x.tar.gz套件(在 ftp://ftp.4front-tech.com/ossfree 中的公用程式現已能處理這種狀況了. 最新的驅動程式也已修正, 避免配置小於4096 bytes的碎塊, 解決了舊公用程式的問題.

6.33 音效驅動程式為何要用自己的設定程式?

音效驅動程式支援很多不同的設定參數. 驅動程式中的configure 會檢查各參數間的相依性. 而核心的設定工具就沒有提供這樣的功能.

這就是說, 最新的核心部份地允許音效驅動程式使用標準核心設定工具(參見前面 ``設定核心''那一小節.)

6.34 我載入音效驅動程式模組後,混音設定就被重設了

您可以將音效驅動程式做成可載入模組, 並使用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中將混音程式加進去.

6.35 只有root能錄音

在Readme.linux中的script, 會將音效設備檔設成僅有root可讀, 這是為了填補 安全上的漏洞. 在網路環境裡, 外面的使用者可以遠端連進有音效卡及麥克風的Linux系統 並竊聽. 如果您不擔心這個, 您可以改變這個script中的權限.

在預設的安裝法, 一般使用者仍然可以播放音效檔. 這不會造成安全上的負擔, 反而可 以省掉很多麻煩.

6.36 在IBM ThinkPad上的音效硬體可以支援嗎?

關於如何在Linux下使用IBM ThinkPad上的mwave音效卡之資訊, 可在 http://www.screamin.demon.co.uk/查到.


Next Previous Contents