这一节回答经常在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/查到.