📄 sound-howto-6.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.7">
<TITLE>The Linux Sound HOWTO -- Linux 音效指引: 常见问题与解答</TITLE>
<LINK HREF="Sound-HOWTO-7.html" REL=next>
<LINK HREF="Sound-HOWTO-5.html" REL=previous>
<LINK HREF="Sound-HOWTO.html#toc6" REL=contents>
</HEAD>
<BODY>
<A HREF="Sound-HOWTO-7.html">Next</A>
<A HREF="Sound-HOWTO-5.html">Previous</A>
<A HREF="Sound-HOWTO.html#toc6">Contents</A>
<HR>
<H2><A NAME="s6">6. 常见问题与解答</A></H2>
<P>
<P>
<P>这一节回答经常在Usenet讨论区及通信论坛常被问到的问题.
<P>
<P>可以在OSS音效驱动程式的网站看到更多问题的解答.
<P>
<H2><A NAME="ss6.1">6.1 这一堆音效设备档各代表什麽?</A>
</H2>
<P>
<P>
<P>以下是最``标准''的设备档档名, 虽然有些Linux套件可能用不太一样的名称.
<P>
<DL>
<DT><B>/dev/audio</B><DD><P>一般是连到 <CODE>/dev/audio0</CODE>
<DT><B>/dev/audio0</B><DD><P>和Sun工作站相容的声讯设备 (只作了部份, 并不支援Sun的ioctl
介面, 只有u-law编码)
<DT><B>/dev/audio1</B><DD><P>第二个音讯设备 (如果音效卡支援, 或不只有一张音效卡的话)
<DT><B>/dev/dsp</B><DD><P>一般连到 <CODE>/dev/dsp0</CODE>
<DT><B>/dev/dsp0</B><DD><P>第壹数位取样设备
<DT><B>/dev/dsp1</B><DD><P>第贰数位取样设备
<DT><B>/dev/mixer</B><DD><P>通常连结到 <CODE>/dev/mixer0</CODE>
<DT><B>/dev/mixer0</B><DD><P>第壹混音器
<DT><B>/dev/mixer1</B><DD><P>第贰混音器
<DT><B>/dev/music</B><DD><P>高阶编曲器介面
<DT><B>/dev/sequencer</B><DD><P>低阶MIDI, FM, 及GUS存取用
<DT><B>/dev/sequencer2</B><DD><P>通常连结到 <CODE>/dev/music</CODE>
<DT><B>/dev/midi00</B><DD><P>第壹原生(raw)MIDI埠
<DT><B>/dev/midi01</B><DD><P>第贰原生MIDI埠
<DT><B>/dev/midi02</B><DD><P>第参原生MIDI埠
<DT><B>/dev/midi03</B><DD><P>第肆原生MIDI埠
<DT><B>/dev/sndstat</B><DD><P>读取时, 显示音效驱动程式的状态
</DL>
<P>
<P>PC喇叭驱动程式提供以下设备:
<P>
<DL>
<DT><B>/dev/pcaudio</B><DD><P>和/dev/audio同样
<DT><B>/dev/pcsp</B><DD><P>和/dev/dsp一样
<DT><B>/dev/pcmixer</B><DD><P>和/dev/mixer一样
</DL>
<P>
<H2><A NAME="ss6.2">6.2 怎样播放音效档案?</A>
</H2>
<P>
<P>
<P>Sun工作站的音效档(.au)可以丢到<CODE>/dev/audio</CODE>来放出, 原始取样档可以丢到
<CODE>/dev/dsp</CODE>, 虽然这样一般来说会产生很差的输出. 使用像<CODE>play</CODE>这样的
程式比较好, 而且还能辨别音效档格式, 设定正确的取样率等.
<P>
<P>像wavplay或vplay(在snd-util套件中)的程式, 给它WAV档会产生最佳结果. 然而它们无法
辨识Microsoft ADPCM压缩过的WAV档. 同时, 旧版的play(在Lsox套件中)对16位元的WAV档
处理并不好.
<P>
<P>在snd-util中的splay命令如果以手动输入适切的参数, 可以用来播放多数音效档.
<P>
<H2><A NAME="ss6.3">6.3 怎样录制音效档?</A>
</H2>
<P>
<P>
<P>可以从<CODE>/dev/audio</CODE>或<CODE>/dev/dsp</CODE>中读取取样过的资料, 可以转向到档案
去. 像<CODE>vrec</CODE>这样的程式可以较简单地控制取样率及时间等. 你也需要混音器,
以便选择想要的输入来源.
<P>
<H2><A NAME="ss6.4">6.4 我可以有不只一片音效卡吗?</A>
</H2>
<P>
<P>
<P>现在的音效驱动程式允许你装好几片声霸卡, 声霸卡Pro, 声霸卡16, MPU-401 或MSS卡.
装两片声霸卡是可能的, 不过要手动编辑 local.h, 定义SB2_BASE, SB2_IRQ, SB2_DMA
及 SB2_DMA2(有些情形下才要). 也可以同时装一片声霸卡及一片PAS16.
<P>
<P>若是你用make config来设定较新的2.0.x版核心的音效的话, 你应该编辑<CODE>/usr/include/linux/autoconf.h</CODE>而非<CODE>local.h</CODE>. 你会看到几行:
<P>
<BLOCKQUOTE><CODE>
<PRE>
#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)
</PRE>
</CODE></BLOCKQUOTE>
<P>在它们後面加入几行(数值依照你的系统设定)
<P>
<BLOCKQUOTE><CODE>
<PRE>
#define SB2_BASE 0x330
#define SB2_IRQ (7)
#define SB2_DMA (2)
#define SB2_DMA2 (2)
</PRE>
</CODE></BLOCKQUOTE>
<P>
<P>以下驱动程式不准你装两片卡:
<P>
<UL>
<LI>GUS (驱动程式限制)</LI>
<LI>MAD16 (硬体限制)</LI>
<LI>AudioTrix Pro (硬体限制)</LI>
<LI>CS4232 (硬体限制)</LI>
</UL>
<P>
<H2><A NAME="ss6.5">6.5 错误: No such file or directory for sound devices</A>
</H2>
<P>
<P>
<P>要建立设备档啊! 请参见前面建立设备档的部份. 如果你确实有设备档, 检查主编号及次
编号是否正确. (一些旧一点的CD-ROM Linux套餐可能不会在安装时建立正确的设备档)
<P>
<H2><A NAME="ss6.6">6.6 错误: No such device for sound devices</A>
</H2>
<P>
<P>
<P>你的核心并不支援音效驱动程式, 或是I/O位址设定和硬体不一致. 检查你是否用新造的
核心开机, 并确认其设定和硬体是一致的.
<P>
<H2><A NAME="ss6.7">6.7 错误: No space left on device for sound devices</A>
</H2>
<P>
<P>
<P>如果你没有建立必要的设备档, 然後把音效档朝/dev/audio或/dev/dsp丢, 就会发生这种
情况. 这时这些``设备档''其实只是普通档案, 而且把你的磁碟塞满了. 你必
须照本文件中<EM>建立设备档</EM>这一小节的指引去执行那个script.
<P>
<P>在Linux 2.0或之後, 当设备开启, 系统却没有足够的RAM时亦会发生. 对每个DMA通道,
音效驱动程式至少需要两页(8K)连续记忆体区块. 这种情型在不足16M的RAM或已经启动很
久的系统上可能发生. 要清出一些RAM, 在再开启设备档以前, 先编译及执行以下的C程式
也许可行.
<P>
<BLOCKQUOTE><CODE>
<PRE>
main() {
int i;
char mem[500000];
for (i = 0; i < 500000; i++)
mem[i] = 0;
exit(0);
}
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H2><A NAME="ss6.8">6.8 错误: Device busy for sound devices</A>
</H2>
<P>
<P>
<P>一个音效设备一次只能给一个程序用. 问题中, 最可能就是有别的程序正在使用这个设
备. 确定的方法之一是用<CODE>fuser</CODE>命令:
<P>
<BLOCKQUOTE><CODE>
<PRE>
% fuser -v /dev/dsp
/dev/dsp: USER PID ACCESS COMMAND
tranter 265 f.... tracker
</PRE>
</CODE></BLOCKQUOTE>
<P>
<P>在上例中, fuser命令显示265号程序开启了该设备. 可以选择等它做完或把它砍掉, 这样
它就又能使用了. 你应该以root身份执行<CODE>fuser</CODE>命令, 这样才会列出除了你以外
的使用者.
<P>
<H2><A NAME="ss6.9">6.9 还是逃不了'device busy'的错误!</A>
</H2>
<P>
<P>
<P>根据Brian Gough的说法, 使用一号DMA通道的声霸卡会和同样也占用DMA 1的QIC-02磁带机
驱动程式相冲, 造成``device busy''错误. 如果您使用FTAPE, 您可能有加进
这个驱动程式. 根据FTAPE-HOWTO, QIC-02驱动程式在使用FTAPE上不是必要的; 只有
QIC-117才必要. 重造核心, 使用QIC-117驱动程式, 取消QIC-02, 这样FTAPE及音效驱动程
式就能共存了.
<P>
<H2><A NAME="ss6.10">6.10 音效档放到一半就停了</A>
</H2>
<P>
<P>
<P>这种症状, 通常是先播放一秒左右, 然後完全停止, 或印出``missing IRQ''
或``DMA timeout''讯息. 八成是您的IRQ或DMA设错了. 核对一下, 您在核心中
的设定是不是和硬体跳线的一样, 而且并没有和别的卡相冲.
<P>
<P>另一种症状是声音一直重覆. 这通常导因於IRQ冲突.
<P>
<H2><A NAME="ss6.11">6.11 播放MOD档断断续续</A>
</H2>
<P>
<P>
<P>要播放MOD档, 需要可观的CPU能力. 您可能跑太多程式导致系统反应过慢, 无法及时放
音. 有下面几种解法:
<P>
<UL>
<LI>用较低的取样率, 或只放单声道</LI>
<LI>把其它执行中程式干掉</LI>
<LI>买更快的电脑</LI>
<LI>买更强的音效卡(像 Gravis UltraSound)</LI>
</UL>
<P>
<P>如果您有用Gravis UltraSound音效卡, 您应该使用专为GUS设计的MOD播放程式
(如 <CODE>gmod</CODE>)
<P>
<H2><A NAME="ss6.12">6.12 编译音效软体时出错</A>
</H2>
<P>
<P>
<P>1.0c版以後和以前的音效驱动程式用完全不同且不相容的<CODE>ioctl()</CODE>方式. 抓新版
的原始码, 或做必要改变, 把它移执到适合新版驱动程式用. 详见音效驱动程式的
<CODE>Readme</CODE>档.
<P>
<P>也请确定编译应用程式时, 您使用最新的<CODE>soundcard.h</CODE>及<CODE>ultrasound.h</CODE>.
请见本文开头处里的安装指引.
<P>
<H2><A NAME="ss6.13">6.13 以前跑很好的软体, 却出现SEGV错误</A>
</H2>
<P>
<P>
<P>这和上个问题可能是一样的.
<P>
<H2><A NAME="ss6.14">6.14 音效驱动程式有何已知的限制及bug?</A>
</H2>
<P>
<P>
<P>看音效程式里附的<CODE>Readme</CODE>及<CODE>CHANGELOG</CODE>档.
<P>
<H2><A NAME="ss6.15">6.15 关於音效驱动程式的ioctl等, 哪里有记载?</A>
</H2>
<P>
<P>
<P>它们有一部份放在现在以草案型式存在的<EM>Hacker's Guide to VoxWare</EM>.
最新版是第二草案, 可在
<A HREF="ftp://nic.funet.fi/pub/OS/Linux/ALPHA/sound">ftp://nic.funet.fi/pub/OS/Linux/ALPHA/sound</A>
中找到. 注意这目录是``隐藏的'', 不会在目录列表出现. 如果您``cd''
进去再``dir''就可以发现这些档案.
<P>
<P>在写这篇时, 新文件已经可以在4Front Techonlogies的网站上看到了.
<P>
<P>另一个来源就是Linux Multimedia Guide, 在参考资料那节有讲.
<P>
<H2><A NAME="ss6.16">6.16 要完全平顺地录放音, 需要多强的CPU才能办到?</A>
</H2>
<P>
<P>
<P>这问题不好回答, 它取决於:
<P>
<UL>
<LI>使用PCM取样还是FM合成</LI>
<LI>取样率及样本大小</LI>
<LI>用哪个程式录放音</LI>
<LI>音效卡硬体</LI>
<LI>磁碟传输速率, CPU时脉频率, 快取大小等</LI>
</UL>
<P>
<P>一般来说, 任何386机器应该都可以在8位元音效卡上播放音效, 或用FM合成放
音乐.
<P>
<P>然而, 放MOD档需要可观的CPU资源. 一些实验性的测量显示, 要以44KHz播放,要消耗一颗
486/50 CPU的 40% 能力; 386/25几乎不可能放比22KHz 更高的取样率.(以8位元音效卡,
如声霸卡, 所测得)一些像Gravis UltraSound的卡硬体提供更多功能, 需要的CPU资源就
较少.
<P>
<P>这些是假设电脑没有在跑其它耗CPU能力的工作.
<P>
<P>如果您的电脑有数学辅助处理器(或CPU内部有FPU), 用像<CODE>sox</CODE>这样的程式做
音效转换或增加效果会快不少. 虽然核心驱动程式本身是没有用到浮点运算啦.
<P>
<H2><A NAME="ss6.17">6.17 PAS16和Adaptec 1542 SCSI卡的搭配问题</A>
</H2>
<P>
<P>
<P>(以下解释由<CODE>seeker@indirect.com</CODE>提供)
<P>
<P>Linux只能认出在330(预设值)或334位址上的1542, 而PAS只能将MPU-401模拟设在
330. 即使你用软体消去MPU-401, 如果有东西还在这个预设位址上, 仍然会和1542
相冲. 把1542移到334就什麽都解决了.
<P>
<P>另外, 1542和PAS-16都有用到16位元DMA, 所以如果你一面以16位元, 44KHz立体声
录音, 一面将档案存到挂在1542上的硬碟的话, 麻烦就来了. DMA会重叠, 导致RAM没有
时间充电, 然後就会出现 "PARITY ERROR - SYSTEM HALTED" 的讯息, 您
甚至还来不及知道怎麽当的. 更糟糕的是有些QIC-117磁带的协力厂商建议设定汇流排
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -