-
Linux/ALSA下SRC(Sample Rate Convertion)引起的音质问题和解决方案
2008-02-09 20:13:06
这里不涉及基本音质问题,所以如果你有爆音的问题请参考论坛里如何设置PCM音量以避免增益带来的削波失真的文章;或者你有背景噪声,请尝试关闭声卡的录音和与你所需输出声道无关的接口。此外数字输出和外置解码器不在讨论范围。如果你有一片过得去的声卡,音质在感觉上已经不错了,那么你可以看看下面。当然如果你只是疑惑Linux是否真有音质问题,或者是怎么发生的,也可以参考。
最近在使用一块Terratec DMX 6Fire LT(音频I/O控制器是 Ice1712[Envy24])的时候,我发现envy24control这个功能强大的控制软件面板上总是显示这片声卡正在使用48KHz的模式,我的音源库基本是从CD转换的FLAC和WAV,采样率都是44.1KHz。DMX 6Fire是一片双晶振的声卡,板上有24.576MHz和22.5792MHz两颗晶体,可以直接支持44.1KHz和48KHz等模式而无需转换。我尝试直接播放一片普通CD,依然自动跳到了48Khz上,真是奇怪。于是我松开了自动Reset频率的选项,手动锁定到44.1KHz,然后播放,没想到声音出来像是慢放的效果,肯定有什么地方不对了。
我使用Amarok管理音乐库,因此想到是否是Xine后端做了自动升频处理,改用ALSA命令行工具aplay播放一段44.1KHz的WAV后,问题依旧。排除了Xine,下面就是ALSA(我使用Xine的ALSA输出插件)本身了,最底层的驱动模块应该没有问题,因为我可以手动锁定到任何改卡规格上支持的模式,只是播放效果不正常。逐渐地我想到了一个问题,Evny24是一个音频I/O芯片,并没有CS46xx一类DSP的计算处理能力,应该不支持硬件混音。表现到计算机上,就是多个音频流无法同时开启,你不能在播放音乐的同时再去开一个电影播放器,甚至IM软件的消息通知音都无法播放。但是在我的系统下同时开出一打的音频程序确实又没有问题,最终我把目光放到了ALSA的软件混音插件DMix上。
由于从前我的声卡使用CS4630芯片或者EMU10K,dsp具有硬件多音频流和SRC功能,因此不太使用DMix。但现在我决定还是去掉DMix看看是否有用。在/usr/share/alsa/cards/下,我找到了ICE1712芯片声卡的预设文件ICE1712.conf。并注释掉了开头一段dmix相关的项目。然后我用aplay播放一段44.1KHz的WAV,声卡终于自动跳转到了正确的模式!当然作为代价,相应地我暂时失去了软件混音的功能。# default with dmix & dsnoop
ICE1712.pcm.default {
@args [ CARD ]
@args.CARD {
type string
}
type asym
playback.pcm {
type plug
slave.pcm {
@func concat
strings [ "dmix:" $CARD ",FORMAT=S32_LE" ]
}
}
capture.pcm {
type plug
slave.pcm {
@func concat
strings [ "dsnoop:" $CARD ",FORMAT=S32_LE" ]
}
}
}
结论很清楚,现在的ALSA默认已经为不具备硬件多音频流混音功能的声卡默认开启了DMix,而因为DMix需要混音,也就是把多个可能是不同取样率的音频流混合输出,因此它需要一个较高的常用取值作为基准。默认会采用48KHz的Sample Rate,若是低于此频率,则升频到48KHz。接下去的问题是,DMix在SRC之后,是否影响听感?在我看来,是有一定影响的,比如小提琴的高音延展会不足,而较为纤细的泛音被DMix做SRC之后也会被削弱或模糊。因此如果你有双晶震声卡,并对44.1KHz回放的音质有所不满,那么你可以考虑在欣赏音乐的时候关闭DMix,这样可以完全发挥双晶振声卡应有的实力。当然如果你只重视44.1KHz音源例如从CD抓轨的APE/FLAC/WAV,而对DVD或者其他视频相对来说无所谓一些,同时不想失去软件多音频流支持,那么你也可以只把DMix设定到默认44.1KHz,享受音乐,迁就视频。
将DMix的默认输出频率设定到44.1KHz,可参考以下~/.asoundrc作出自己的设定:pcm.!default {
type plug
slave.pcm "dmixer"
}
pcm.dsp0 {
type plug
slave.pcm "dmixer"
}
pcm.dmixer {
type dmix
ipc_key 1024
slave {
pcm "hw:0,0"
period_time 0
period_size 1024
buffer_size 8192
rate 44100
}
bindings {
0 0
1 1
}
}
ctl.mixer0 {
type hw
card 0
}
除此之外,有些声卡只有单晶振,无法支持两种频率,必须透过SRC。如此情况下,高品质的SRC至少可以降低失真。ALSA考虑到这种情形,允许通过插件调用外部高品质SRC库进行转换运算。为了使用外部SRC,你需要libasound2-plugins,libsamplerate0等软件包(源中均有)。安装完毕后,在~.asoundrc 中加入default.pcm.rate_converter "samplerate_best"来启用最佳SRC算法。
-
FLAC音频在xine后端播放器上的进度定位
2007-12-31 21:40:49
FLAC作为自由的lossless音频格式,被广为采用(国内可能不及APE)。近日有个朋友抱怨用Amarok管理FLAC库后,很多FLAC文件播放时拖动进度标条,却一下子没了声音,要许久许久才能恢复,而且往往还是定位错误了的,而在其他一些播放器上却没有这个问题。
Amarok目前使用的后端是xine,所以先实验了其他xine做后端的播放器,如出一辙。随即搜索了一下maillist,发觉很多人都在抱怨同样的问题,却没有搜到能解决问题的patch。思索之余,觉得如果不能改变播放器,不如从文件本身入手:flac本身可以写入元数据信息(metadata),其中包括了定位点(seek points)索引表,可能有一些文件并没有包含这部分信息。从播放器来看,只要支持索引表跳转,就能定位(xine应该是可以的,因为有些flac还是可以跳转的)。
有了思路,下面的问题就好办了,只要安装了flac这个软件包,就可以找到metaflac这个元数据修改工具(CLI tool)。metaflac的功能强大,具体用法可看手册。加入定位点信息的参数为--add-seekpoint,为了取得较为精确平滑的定位效果,我们可以采取比较激进的参数,精确到1秒。切换到专辑文件目录下,用以下命令为当前目录下所有的flac文件写入定位索引表信息:metaflac --add-seekpoint=1s *.flac
然后启动Amarok播放,效果良好,完全可以达成精确快速的定位。
-
惠普廉价系激光打印机在Ubuntu上的即插即用
2007-12-03 23:56:28
在Ubuntu 7.04或者7.10下,由于CUPS项目以及foo2zjs的帮助,惠普Laserjet 1xxx这类打印机是可以很好地即插即用的。但是,你会发现当关闭打印机电源后重开的时候也许情况不是那么好了,用户会发现打印队列里的东西永远也到不了打印机。
为什么会这样呢?因为Laserjet 1000需要加载驱动程序附带的firmware才能初始化,在windows下,这是自动的。Ubuntu从Feisty(7.04)起已经修正了自动加载(bug#65618),但由于版权原因系统没有带改firmware。用户可以通过foo2zjs自带的程序抓取之。
执 行 $getweb 1000 后,将会自动从internet下载sihp1000.img,然后再执行 $sudo arm2hpdl sihp1000.img > /usr/share/foo2zjs/firmware/sihp1000.dl 则将该文件放置到foozjs指定目录下,这样一来每次插入Laserjet1000时,系统会自动从该处加载这个firmware,相当于自动执行了 cat /usr/share/foo2zjs/firmware/sihp1000.dl /dev/lp*。
完成后可关闭并重新启动打印机,滚轮将会转动两次,并且信号灯跳越后停在绿灯上表示工作就绪,此时即可直接打印了。
updated: 另外,在KUbuntu7.10下,默认可能无法找到foo2zjs驱动(ppd)的打印机,它们不在列表里(如HPLaserJet 1000),这时可以手动选择到/usr/share/foo2zjs/ppd中的压缩后ppd驱动文件(.ppd.gz)。
-
在Ubuntu上使用MAYA8的常见问题备忘
2007-12-03 23:47:32
受朋友之托,看看MAYA 8.0 for Linux在Ubuntu上安装和运行中有一些什么问题。在实验了几次之后,确实发现了一些问题,搜索和尝试解决之后,总结如下:
1. 安装CSH,Maya的脚本是csh的,而Ubuntu默认没有安装。
2. 必须安装的三个包为:awcommon awcommon-server和maya8
3. RPM- for linux的安装包是为RPM格式的,最好用alien转换成deb安装。转换时强烈推荐用"--scrīpts"参数(alien --scrpits xxx.rpm)。
4. 转换完安装之前先在根目录下做一名为aw的个符号链接: ln -s /usr/aw /aw,没有相应目录则开一个空的(否则安装的时候可能会有错误)。
5. dpkg 安装所有三个转换后的deb打包。
6. 在/usr下建立tmp目录,给予写权限,否则mentalray渲染器在render时可能会出错。
7. 如果Maya默认启动后会有使用右键鼠标光标跳回X窗口系统原始默认的大叉形状而不是窗口管理器指定的光标。这个可以修改maya的启动脚本文件加以解决, 方法是在/usr/aw/maya8.0/bin/maya中加入环境变量MAYA_MMSET_DEFAULT_XCURSOR。一定要用 "setenv MAYA_MMSET_DEFAULT_XCURSOR 1" 而不是"export MAYA_MMSET_DEFAULT_XCURSOR 1",因为export是bash的语法,而Maya写的是csh脚本所以不吃bash那套。
8. 修改默认的界面使用的字体和UI调色盘可以通过修改/usr/aw/maya8.0/app-defaults/MayaScheme来实现,在这里配置自己喜欢的字体族和颜色方案。
附带Cobra在chinaVFX上post的深色UI及字体调教后的MayaScheme内容(Thx buddy!):
*extraLargeBoldLabelFont: -*-helvetica-bold-r-normal-*-17-*-*-*-*-*-iso8859-1
*largeBoldLabelFont: -*-helvetica-bold-r-normal-*-14-*-*-*-*-*-iso8859-1
*boldLabelFont: -*-clearbold-medium-r-*-*-12-*-*-*-*-*-*-*
!!*boldLabelFont: -*-helvetica-bold-r-normal-*-12-*-*-*-*-*-iso8859-1
!!*smallBoldLabelFont: -*-helvetica-medium-r-normal-*-12-*-*-*-*-*-iso8859-1
*smallBoldLabelFont: -*-clearbit-bold-r-normal-*-12-*-*-*-*-*-iso8859-1
*tinyBoldLabelFont: -*-helvetica-bold-r-normal-*-10-*-*-*-*-*-iso8859-1
!!*plainLabelFont: -*-helvetica-medium-r-normal-*-12-*-*-*-*-*-iso8859-1
*plainLabelFont: -*-clearbit-medium-r-normal-*-12-*-*-*-*-*-iso8859-1
*smallPlainLabelFont: -*-lucida-medium-r-normal-*-10-*-*-*-*-*-iso8859-1
*obliqueLabelFont: -*-helvetica-bold-o-normal-*-12-*-*-*-*-*-iso8859-1
*smallObliqueLabelFont: -*-helvetica-bold-o-normal-*-10-*-*-*-*-*-iso8859-1
*fixedWidthFont: -*-fixed-medium-r-normal--13-*-*-*-*-*-iso8859-1
*smallFixedWidthFont: -*-lucida-medium-r-*-*-12-*-*-*-*-*-*-*
*XmLabel.fontList: -*-lucida-medium-r-*-*-10-*-*-*-*-*-*-*
*bottomShadowColor: #303030
*topShadowColor: #585858
*basicForeground: #e0e0e0
*basicBackground: #404040
*Maya*background: #404040
*Maya.background: #808080
*XmForm*background: #404040
*XmLabel*background: #404040
*ApplicationShell*background: #404040
*XmRowColumn*background: #404040
*XmMainWindow*background: #404040
*XmCascadeButton*background: #404040
*XmButton*background: #404040
*XmDrawingArea*background: #404040
*XmFrame*background: #404040
*XmTextField.background: #404040
*Maya*foreground: #e0e0e0
*Maya.foreground: #f0f0f0
!!same effect
*Maya.outlinerPanel1.outlinerPanel1.TearOffPane.TopLevelPanelLayout.outlinerForm.outlinerPane.outlinerPanel1.hScroll.height: 20
*Maya*ApplicationShell*XmMainWindow*XmForm*XmMainWindow*XmForm*XmForm*XmForm*XmScrollBar*height: 20
*Maya*ApplicationShell*XmMainWindow*XmForm*XmMainWindow*XmForm*XmForm*outlinerPanel1.hScroll.height: 20
*Maya.MainWindow.MainWindow.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFrameLayout.topShadowColor:#303030
*Maya.MainWindow.MainWindow.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFrameLayout.bottomShadowColor:#585858
*Maya.MainWindow.MainWindow.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFrameLayout.topShadowColor:#303030
*Maya.MainWindow.MainWindow.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFrameLayout.bottomShadowColor:#585858
*Maya*XmText*topShadowColor: #303030
*Maya*XmText*bottomShadowColor: #585858
!!*Maya*XmForm*XmScrollBar*background: #939181
!!*Maya*XmForm*XmPushButton*background: #f4f2e4
!!*Maya*TransientShell*XmRowColumn*background: #e7dff1
*textForeground: #c0c0c0
*textFieldBackground: #6d566d
*readOnlyBackground: #464f44
*buttonBackground: #b7bbae
*scrollBarTroughColor: #b7bbae
*scrollBarControlBackground: #b7bbae
*indicatorBackground: #cbcbcb
*radioColor: #726c5b
*checkColor: #ff0000
*blueSelectBackgroundColor1: #3d5366
*blueSelectBackgroundColor2: #849dae
*drawingAreaBackground: #5d647c
*drawingAreaContrastColor1: #b04b4b
*drawingAreaContrastColor2: #4e3aa4
*drawingAreaContrastColor3: #008700
*drawingAreaContrastColor4: #7d3ca5
*scrolledListBackground: #6d6d6d
*textBackground: #585858
*highlightColor1: #ff0000
*highlightColor2: #0000ff
*highlightColor3: #00ff00
*highlightColor4: #a01ef0
*highlightColor5: #ffa500
*highlightColor6: #00ffff
*highlightColor7: #ff00ff
*HighlightColor8: #ffff00
*wMBackground: #aaaaaa
*wMForeground: #000000
*wMActiveBackground: #c6c1aa
*wMActiveForeground: #000000
*textSelectedBackground: #909070
*textSelectedForeground: #201020
*indicatorLightColor: #ffff00
*selectFillColor: #ffff00
*redColor: #ef001c
*orangeColor: #e46800
*yellowColor: #d9b000
*greenColor: #169612
*blueColor: #3063a2
*brownColor: #924c39
*purpleColor: #924f95
*errorColor: #c60000
*warningColor: #0067a8
*informationColor: #00ff00
*alternateBackground1: #c1adad
*alternateBackground2: #a7b7a7
*alternateBackground3: #bbbbcd
*alternateBackground4: #9fbfbf
*alternateBackground5: #87aaca
*alternateBackground6: #d1d1c9
*disabledTextForeground: #aaaaaa
*layerAdjustmentTextForeground: #e56929
*lightRadioFillColor: #9e9edc
*disabledCheckColor: #dc9e9e -
修复因安装不友好的deb导致包管理系统瘫痪的思路
2007-12-03 23:45:43
有一些不怎么友好的deb软件包可能由于某种原因(比如转换不完全成功)安装到一半失败,而想卸载却又卸不掉。无论用什么apt或者dpkg的命令都无法起作用时,用 户可能会很着慌,以至于要备份并重新安装整个系统。这时先不要急,因为一般性的情况下,并不是整个包管理系统真的损坏了,而只是因为一些情况在包管理系统 的意料之外而拒绝读取索引。只要手动从dpkg的索引文件和相关目录删除这些软件的信息/文件即可让包管理系统恢复正常。
对于deb系统而言,其实安装软件包不外乎把软件解压缩到指定的目录下去,然后运行设定脚本去读取一些环境变量来生成 一些配置文件。完了之后dpkg会把安装结果和软件包状态的变化记录到索引文件中去(apt也一样,因为它在安装软件包时其实是调用了dpkg)。所以我 们手动删除这些信息之后就和没安装过他们一模一样。要手动删除一个软件包,要做的就是:
1.找出软件包安装的文件的列表,一一删除之。
2.在索引文件中找到这些软件包的信息并删除之。
3.重建索软件包集合信息。
如果要求不高,只希望包关系系统恢复工作的话,只需要2和3就够了。用不着的文件暂时放一放也无妨(前提是不会对系统安全性产生威胁)。对应的信息获取地点和操作地点:
1.软件包的文件列表,在包内,只要deb还在(一般通过apt缓存的包放在/var/cache/apt/archives),用dpkg -c XXX.deb就可以得到。
2.索引信息,一般在/var/lib/dpkg/status,文本文件,结构简单清楚;另外/var/lib/dpkg/info下有每个安装过的包的信息文件信息(和MD5校验),一组3-4个文件,以软件包命名,后缀为list、md5等等,酌情删除。
3.apt-get update
上 面3条不能保证100%删除所有软件包残留信息,只是能够尽快让apt/dpkg恢复工作。一些注册信息比如向gconf注册schema需要额外步骤来 注销,也许比较省力的方法就是设法找一个更新后或者版本兼容的deb替代安装,如此就能覆盖掉以前的信息,再删除就清除了所有的残留。
