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 了。

没有评论: