2009年1月15日星期四

xboard/winboard

这是一个 chess 的 frontend,后者是前者的 Win32 port,不过有一些功能比如和 cmail 协同工作是没有实现的。这个 frontend 现在可以用来做三件事情,一个是使用它调用 chess engine 用来人机对战或者机机对战;一个是连接到 Internet Chess Server (以下简称 ICS)参加网上的游戏;还可以用来查看棋局。

由于我对 chess 不算特别了解,所以现在写的比较偏技术化,而不是偏棋局功能。既然 xboard 是个 frontend,那么势必有一个所谓的 backend 亦即 chess engine 作为后台计算程序,常见的 backend 有 gnu chess 或者 crafty 等,他们使用类似的协议与 frontend 通信,这也就使得我们可以用不同的 backend 互较高下,作为比试谁的 engine 牛,同时也使得算法、界面分离开来。类似的 frontend 还有 eboard 等。

xboard 含有如下的内容,
/usr/games/xboard
/usr/games/zic2xpm
/usr/games/cmail
/usr/games/pxboard
/usr/share/man/man6/pxboard.6.gz
/usr/share/man/man6/xboard.6.gz
/usr/share/man/man6/zic2xpm.6.gz
/usr/share/info/xboard.info.gz
/usr/share/doc/xboard/changelog.gz
/usr/share/doc/xboard/zippy.README.gz
/usr/share/doc/xboard/READ_ME
/usr/share/doc/xboard/FAQ.gz
/usr/share/doc/xboard/NEWS.gz
/usr/share/doc/xboard/FAQ.html
/usr/share/doc/xboard/ToDo.gz
/usr/share/doc/xboard/copyright
/usr/share/doc/xboard/changelog.Debian.gz
/usr/share/doc/xboard/ChangeLog.2.gz
/usr/share/menu/xboard
/usr/share/games/xboard/bitmaps.xchess
/usr/share/games/xboard/bitmaps.xchess/b108o.bm
...
/usr/share/lintian/overrides/xboard
/usr/share/man/man6/cmail.6.gz
主要程序包含 xboard、zic2xpm、cmail 和 pxboard,分别是主程序、将 zic 格式转换成为 xboard 可以读取的格式、从 email 里面读取和玩 chess、将一个局通过管道送给 xboard 在上面玩。

如果我们想进行人机对战,可以用 -fcp/-scp 指定两个 engine,-st/-depth 指定搜索时间或者搜索深度;如果是联网,则可以 -ics,并用 -icshost/-icsport 指定服务器,这是还需要一个 helper 程序 -icshelper,用于登录发出命令和服务器交互(如 freechess.org 用 timeseal、而 chessclub.com 用 timestamp);-lgf 可以从文件里面读取牌局。

连接到 ICS 上可以用下面的命令,如 help 获得帮助,who 列出用户,games 列出现在的局,比较有用的是邀战 match id time inc,其中 id 是对方的注册号,time 是每方使用的时间(分 lightening,blitz 和 standard),inc 是每下一步增加的时间(常用方法是 time = 10,inc = 0 这样限制每盘时间,或者 time = 2,inc = 12,这样相当于最长思考时间不能超过 2min,每一步平均大约是 12s)。提出这个请求后,可以 accept 或者 decline。finger id 可以获得某人的比分情况。vars 列出自己的 configuration,可以用 set 设置。可以用 observe id/game id 观战。examine 可以获得最近进行那盘棋的信息。比较常用的命令是 getgame,这个会匹配自己的时间什么的自动获得一盘棋局。这里有一个入门介绍,以及详细的命令指南

我们下面看看 gnuchess 这个 engine,
/usr/games/gnuchess
/usr/games/gnuchessx
/usr/share/doc/gnuchess/README
/usr/share/doc/gnuchess/TODO
/usr/share/doc/gnuchess/README.Debian
/usr/share/doc/gnuchess/copyright
/usr/share/doc/gnuchess/NEWS.gz
/usr/share/doc/gnuchess/changelog.Debian.gz
/usr/share/doc/gnuchess/changelog.gz
/usr/share/menu/gnuchess
/usr/share/man/man6/gnuchess.6.gz
/usr/share/man/man6/gnuchessx.6.gz
其实 gnuchess 就是一个文本下面的 chess,但是用户必须对表达方式比较熟悉,如使用坐标之类的。类似的,crafty 也是这样的东西,
/usr/games/crafty.bin
/usr/games/crafty
/usr/share/crafty/crafty.hlp
/usr/share/doc/crafty/read.me.gz
/usr/share/doc/crafty/changelog.Debian.gz
/usr/share/doc/crafty/README.Debian
/usr/share/doc/crafty/copyright
/usr/share/doc/crafty/changelog.gz
/usr/share/doc/crafty/crafty.doc.gz
/usr/share/doc/crafty/crafty.faq.gz
/usr/share/man/man6/crafty.6.gz
/usr/share/man/man5
/usr/share/man/man5/crafty.rc.5.gz
/usr/share/lintian/overrides/crafty
/usr/share/doc-base/crafty
/usr/share/menu/crafty
/var/lib/crafty/book.lrn
/var/lib/crafty/position.lrn
/var/lib/crafty/TB
/etc/crafty.rc
/usr/share/man/man6/crafty.bin.6.gz
这里可以看见比 gnuchess 复杂了不少,还有专门的 rc 控制其行为。

和 xboard 类似,还有 eboard,
/usr/games/eboard
/usr/bin/eboard-config
/usr/bin/eboard-addtheme
/usr/share/applications/eboard.desktop
/usr/share/pixmaps/eboard.xpm
/usr/share/man/man1/eboard-config.1.gz
/usr/share/man/man1/eboard-addtheme.1.gz
/usr/share/man/man6/eboard.6.gz
/usr/share/games/eboard/classic.png
/usr/share/games/eboard/ghouls.png
/usr/share/games/eboard/plastic.png
/usr/share/games/eboard/eboard_themes.conf
/usr/share/games/eboard/NAG.en.txt
/usr/share/games/eboard/eboard.cs.dict
/usr/share/games/eboard/eboard.de.dict
/usr/share/games/eboard/eboard.es.dict
/usr/share/games/eboard/eboard.fr.dict
/usr/share/games/eboard/eboard.hu.dict
/usr/share/games/eboard/eboard.it.dict
/usr/share/games/eboard/eboard.ja.dict
/usr/share/games/eboard/eboard.pl.dict
/usr/share/games/eboard/eboard.pt_BR.dict
/usr/share/lintian/overrides/eboard
/usr/share/doc/eboard/Crafty.txt
/usr/share/doc/eboard/DGTboard.txt
/usr/share/doc/eboard/FICS-Timeseal.txt
/usr/share/doc/eboard/GNUChess4.txt
/usr/share/doc/eboard/GNUChess5.txt
/usr/share/doc/eboard/Makefile
/usr/share/doc/eboard/Scripts.txt
/usr/share/doc/eboard/Sjeng.txt
/usr/share/doc/eboard/Themes.txt
/usr/share/doc/eboard/copyright
/usr/share/doc/eboard/changelog.gz
/usr/share/doc/eboard/README.gz
/usr/share/doc/eboard/changelog.Debian.gz
/usr/share/menu
/usr/share/menu/eboard
功能上似乎允许直接用 LAN 联机。

2009年1月10日星期六

alsa-oss

很多老程序都是用 OSS 做声音驱动的(如 mp3blaster),ALSA 为这些程序提供了一种解决方案,这就是 alsa-oss
/usr/lib/libalsatoss.a
/usr/lib/libalsatoss.so.0.0.0
/usr/lib/libossredir.la
/usr/lib/libaoss.a
/usr/lib/libossredir.a
/usr/lib/libaoss.la
/usr/lib/libalsatoss.la
/usr/lib/libaoss.so.0.0.0
/usr/bin/aoss
/usr/share/lintian/overrides/alsa-oss
/usr/share/man/man1/aoss.1.gz
/usr/share/doc/alsa-oss/copyright
/usr/share/doc/alsa-oss/changelog.gz
/usr/share/doc/alsa-oss/changelog.Debian.gz
/usr/include/oss-redir.h
/usr/lib/libalsatoss.so
/usr/lib/libaoss.so
/usr/lib/libaoss.so.0
/usr/lib/libalsatoss.so.0
可以看出来,这里提供了一个命令而已,那么是怎么实现的呢?可以很容易发现 aoss 本质上只是一个 bash script,其内容如下:
#!/bin/sh

# A simple script to facilitate the use of the OSS compatibility library.
# Usage:
# aoss

if [ -d /proc/asound ]; then
prefix=/usr
exec_prefix=${prefix}
LD_PRELOAD=${exec_prefix}/\$LIB/libaoss.so${LD_PRELOAD:+:$LD_PRELOAD} exec "$@"
else
exec "$@"
fi
exit 1
可以看出来在存在 /proc/asound 时(有 ALSA 驱动),该 script 就会在程序执行前提前载入 libaoss.so,这个动态链接库将把调用 OSS 发声程序需要的函数用 ALSA 实现。这是一个非常有意思的技术,也正因为如此,才使得制作 OSS 的 wrapper 成为可能。比如执行 mp3blaster,就可以直接 aoss mp3blaster 了。

esound

Linux 世界里面总是存在着千奇百怪的产品,ESD 算是一个了吧。早期让 Linux 用声音简直是痛苦极了,现在有了 ALSA,还是好了很多,一些遗留下来的工具还在发挥着余热。

ESD 简单说就是一个混音器,但是它允许用户从网络上进行访问(network transparent),这意味着你可以在一台机器上打开播放器,另外一台机器的喇叭响了。这也是采用了 CS 构架的原因。之后有很多类似的项目用来取代 ESD,有的已经停止了开发比如 aRtsD,有的尚还在开发(RoarAudio)或者已经比较完整(如 JACK Audio Connection Kit、NAS 和 PurseAudio),有的和 ESD 类似也是 network transparent,有的不是。

debian 里面服务器在 esound 里面,
/usr/bin/esd
/usr/share/man/man1
/usr/share/man/man1/esd.1.gz
/usr/share/doc/esound
客户端在 esound-clients 里面
/usr/share/man/man1/esddsp.1.gz
/usr/share/man/man1/esdfilt.1.gz
/usr/share/man/man1/esdloop.1.gz
/usr/share/man/man1/esdmon.1.gz
/usr/share/man/man1/esdplay.1.gz
/usr/share/man/man1/esdrec.1.gz
/usr/share/man/man1/esdcat.1.gz
/usr/share/man/man1/esdctl.1.gz
/usr/share/man/man1/esdsample.1.gz
/usr/lib/esound/libesddsp.so.0.2.39
/usr/lib/mime/packages/esound-clients
/usr/bin/esdcat
/usr/bin/esdctl
/usr/bin/esddsp
/usr/bin/esdfilt
/usr/bin/esdloop
/usr/bin/esdmon
/usr/bin/esdplay
/usr/bin/esdrec
/usr/bin/esdsample
/usr/share/doc/esound-clients
/usr/lib/esound/libesddsp.so.0
另外一部分在 esound-common 里面,
/etc/esound/esd.conf
/usr/share/doc/esound-common/TIPS
/usr/share/doc/esound-common/TODO
/usr/share/doc/esound-common/html
/usr/share/doc/esound-common/html/x66.html
/usr/share/doc/esound-common/html/r311.html
/usr/share/doc/esound-common/html/r313.html
/usr/share/doc/esound-common/html/x296.html
/usr/share/doc/esound-common/html/x299.html
/usr/share/doc/esound-common/html/x179.html
/usr/share/doc/esound-common/html/x241.html
/usr/share/doc/esound-common/html/x302.html
/usr/share/doc/esound-common/html/index.html
/usr/share/doc/esound-common/html/x305.html
/usr/share/doc/esound-common/html/x119.html
/usr/share/doc/esound-common/html/c250.html
/usr/share/doc/esound-common/html/x308.html
/usr/share/doc/esound-common/html/x26.html
/usr/share/doc/esound-common/html/c76.html
/usr/share/doc/esound-common/html/x259.html
/usr/share/doc/esound-common/html/x265.html
/usr/share/doc/esound-common/html/c19.html
/usr/share/doc/esound-common/html/x268.html
/usr/share/doc/esound-common/html/c271.html
/usr/share/doc/esound-common/html/x47.html
/usr/share/doc/esound-common/html/a346.html
/usr/share/doc/esound-common/html/x277.html
/usr/share/doc/esound-common/html/x211.html
/usr/share/doc/esound-common/html/c32.html
/usr/share/doc/esound-common/html/x281.html
/usr/share/doc/esound-common/html/c285.html
/usr/share/doc/esound-common/html/c290.html
/usr/share/doc/esound-common/README
/usr/share/doc/esound-common/NEWS.gz
/usr/share/doc/esound-common/README.Debian
/usr/share/doc/esound-common/AUTHORS
/usr/share/doc/esound-common/copyright
/usr/share/doc/esound-common/changelog.gz
/usr/share/doc/esound-common/changelog.Debian.gz
/usr/share/doc-base/esound
其实使用 ESD 很简单,一般或者有某些程序的 module 支持 ESD 输出,可以通过命令行参数 -s server:port 指定或者设定 ESPEAKER 环境变量。

配置文件 /etc/esound/esd.conf 就是 ESD 的 daemon 启动的配置文件了,esd 参数不多,主要就是选择链接类型(-unix 还是 -tcp),指定端口 -port(默认是 5001),指定设备(-d),是否打开时候 beep(-nobeeps)等。可惜必须用 root 启动该进程。

clients 里面提供给我们一些命令,如 esdctl 用来控制 esd 的状态,esdrec 从 server 录下来一段,然后可以用 esdcat 发送给 ESD 播放,esdplay 相当于把一个已有的声音文件如 wav 从 ESD 播放,esdsample 允许播放的时候重采样,另外还有 esdloop 等不是很清楚实际作用。

那么如何使得本地的 mic 可以直接把声音播放到远程主机呢?一种想法就是利用管道,使用 arecord 或者 rec 等程序进行录制,通过管道送给 esdplay。可是实验发现 esdplay 不支持管道...