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