在 Ubuntu 上换用 OSS4 声音系统

首先介绍下背景,Linux 音频系统非常不完全简史:

  •  1. OSS3 是 Linux 内核中比较老的声音系统,目前已逐渐废弃
  •  2. OSS4 开发的时候是闭源软件,所以 2002 年 ALSA 被用来替代 OSS3 作为 Linux 内核中的声音构架
  •  3. 2007 年的时候 4Front Technologies 发布了 GPL 版本的 OSS4,此时 ALSA 已成气候
  • 关于 ALSA,OSS4,PulseAudio 和 Jack 一知半解版介绍(Esd 等就此省略一万字):

  •  1. ALSA 目前是 Linux 内核上标准的音频框架,但是仅支持 Linux 系统,没有软件混响。对各种设备的支持非常全面。
  •  2. OSS4 由于错过时机而没能成为官方内核的一部分,但是它的跨平台性远好于 ALSA,支持 Windows、BSD 和许多 UNIX,其 API 据说也更适合开发。OSS4 有实时、低延时的特性,支持软件混响,所有操作在内核层实现。但是对 USB 设备的支持明显薄弱许多。
  •  3. PulseAudio 是为 POSIX 兼容环境设计的一个声音代理程序,内置软件混响。PulseAudio 可以将程序对声音系统的请求代理到 ALSA、OSS 等多种后端,甚至可以通过网络传输这些讯息。
  • 4. Jack 是一个专业级的声音服务系统,跨平台性强,其表现对内核的实时性要求较 PulseAudio 高一些,在一般的操作系统上 Jack 没有前者流行。
  • Ubuntu 默认使用 ALSA 作为底层声音驱动,程序则与 PulseAudio 交互,这是一个很不错的方案。然而作者偶尔会遇到 ALSA 被独占其他软件无法发声的问题,才随着 -cn 上的 OSS4 热潮赶了把时髦。

    换 OSS4 是要折腾的,折腾就是有风险的,以下为折腾的理由:

  • 1. 默认的 ALSA 在你的电脑上不能正常工作
  • 2. 纯粹喜欢 OSS4,不喜欢 ALSA
  • 3. 想要跟风折腾
  • 换 OSS4 的具体好处:
    1. 某些情况下音质更好
    2. 低延迟,低 CPU 占用
    3. 自带软件混响
    4. 文档更全面

    换 OSS4 的具体坏处:
    1. 有些硬件不被支持
    2. 对 midi 支持很差
    3. USB 声音设备支持仍处于试验性阶段
    4. 自己折腾可能会把系统声音系统搞跨

    开始说安装 OSS4 的具体方法。
    方法一
    到 OSS4 官方网站下载免费商业版, 下载页面
    选择相应的版本,比如 Linux 2.6 (x86) (DEB),点 Submit 获得下载链接。注意这个版本按许可证仅可以使用一年。
    得到 deb 文件后双击安装(或者 sudo dpkg -i oss-linux*.deb)。
    方法二
    Ubuntu 10.10 可以直接从软件仓库安装版本略旧的 OSS4:
    sudo apt-get install oss4-base oss4-dkms oss4-gtk
    Ubuntu 10.04 和 11.04 不可以使用这个方法,10.04 仓库中的 oss4-dkms 存在打包问题无法正确构建内核模块,11.04 因为内核新(linux >= 2.6.36)而 oss4 版本太老而无法成功构建内核模块。
    方法三
    如果你像我一样喜欢开源版,又喜欢折腾,那么我们一起来编译最新版的。
    首先安装 mercurial 以便取回最新版代码:
    sudo apt-get install mercurial
    取出代码:
    cd ~
    hg clone http://opensound.hg.sourceforge.net:8000/hgroot/opensound/opensound oss-devel

    创建编译目录,OSS4 需要在空目录编译:
    cd ~/
    sudo rm -rf oss42build
    mkdir oss42build

    编译并安装,假设你的主目录是 /home/aron:
    cd oss42build/
    NO_WARNING_CHECKS=yes /home/aron/oss-devel/configure --enable-libsalsa=NO
    make
    sudo make deb
    sudo dpkg -i oss*.deb

    安装结束,如果没有遇到错误接下来开始配置:
    1. 尽管 OSS4 内建了软件混响,我还是没有删除 PulseAudio,因为 Ubuntu 的桌面环境很多部件仅设置了 PulseAudio 后端。我不想一一折腾,而只是尽量让程序使用 OSS4,毕竟主要的播放器等都支持自定义音频输出。如果你也这样想,照下面做;如果你不想,跳过这段。

    A. 修改 PulseAudio 设置使其默认使用 OSS4 输出:
    gksu gedit /etc/pulse/default.pa
    添加一行:

      load-module module-oss device=”/dev/dsp” sink_name=output source_name=input mmap=0

    B. 配置 gstreamer 使用 OSS4 作为后端:
    安装 gstreamer0.10-plugins-bad
    sudo apt-get install gstreamer0.10-plugins-bad
    运行命令:
    gstreamer-properties
    将输入和输出均设置为 OSS。

    C. 设置 libasound 将传递给 ALSA 的声音请求转至给 OSS4:
    gksu gedit /etc/asound.conf
    添加以下内容:

      pcm.oss {
      type oss
      device /dev/dsp
      }

      pcm.!default {
      type oss
      device /dev/dsp
      }

      ctl.oss {
      type oss
      device /dev/mixer
      }

      ctl.!default {
      type oss
      device /dev/mixer
      }

    D. 配置启动时默认启用 OSS4 而非 ALSA:
    sudo dpkg-reconfigure linux-sound-base
    选择 OSS 而非 ALSA 或 default。

    然后重启电脑,系统级配置基本完成。然后可以给支持自定义音频系统的软件配置成使用 OSS4,比如 Audacious,Wine,Audacity,VLC, (s)mplayer,clementine。

    2. 如果你想删除 PulseAudio,也有办法,但是不保证所有程序都能正确输出声音。首先是按照前一种配置方法里的 B、C、D 调整设置,然后按照 E 和 F 对 PulseAudio 开刀。

    E. 使用 GStreamer 接管 GNOME 声音系统,安装为 GStreamer 后端编译的 libcanberra:
    sudo add-apt-repository ppa:dtl131/ppa
    sudo apt-get update
    sudo apt-get purge pulseaudio
    sudo apt-get upgrade

    F. 配置 Rhythmbox 等程序使用 Gstreamer (没错,还需要配置)
    运行:
    gconf-editor
    找到 system/gstreamer/0.10/audio/default,将其中所有仍被设置为 pulsesink 的键(如 musicaudiosink 和 chataudiosink)都改为 osssink。
    系统默认的音量控制插件会失效,因为它是基于 PulseAudio 的,可以在面板上单击右键,添加一个 GNOME 的声音控制。

    然后重启,应该绝大部分声音系统都没有问题了。可能存在的问题:
    1.Flash,需要安装 flashplugin-nonfree-extrasound 来获得支持 oss4 的 libflashsupport。
    2.Firefox,xulrunner 无法编译成同时支持 Alsa 和 OSS4,所以可能有问题。

    FAQ

    1. 声音输入不能用,或者有噪音
    运行命令:
    ossxmix
    在显示的界面里把 pink 下拉菜单中选成 input,勾选界面里所有的 input-mix 和 input-mix-mute,然后在 pink 处拖动滑块减小音量,一般以 80% 上下为宜,否则会有噪音。

    2. 如何查看是否已经加载了 OSS4 内核模块,以及我的声卡用了什么模块?
    运行命令:
    lsmod | grep -i oss
    比如我是 HD Audio,输出如下:

      oss_usb 104136 1
      oss_hdaudio 144219 3
      osscore 545146 2 oss_usb,oss_hdaudio

    3. 如何查看我的声卡型号?
    lspci | grep -i audio

    4. 64 位系统能用吗?
    能,没问题。

    5. KDE4 用 Phonon,能用吗?
    Phonon 默认应该可以直接检测到 OSS4。KDE 4.0.x 用 Xine 后端时可能无法使用。

    6. 用什么调节音量?
    如果保留了 PulseAuido,则使用它的程序可以用原来的音量控制,如果是用 Gstreamer,则可以使用 GNOME 的音量控制程序。
    当然,也可以直接使用 ossxmix 工具调整,或者例如 xfce-oss、kmix 这样的工具。

    不想用 OSS4 了,怎么复原?
    我针对上面的 A B C D E F 分别说需要的操作。

    A. 恢复 PulseAudio 默认的硬件检测
    gksu gedit /etc/pulse/default.pa
    删除添加的行。

    B. 配置 gstreamer 使用 PulseAudio 作为后端
    运行命令:
    gstreamer-properties
    将输入和输出均设置为 PulseAuido。
    如果你不想要 gstreamer0.10-plugins-bad,可以删除它:
    sudo apt-get purge gstreamer0.10-plugins-bad

    C. 设置 libasound 使用 ALSA:
    删除 /etc/asound.conf 中增加的所有行。如果你开始折腾 OSS4 之前没有对它做过修改,直接删除就行:
    sudo rm /etc/asound.conf

    D. 配置启动时默认启用 ALSA:
    sudo dpkg-reconfigure linux-sound-base
    选择 ALSA。

    E. 换回支持 Gstreamer 和 PulseAudio 的 libcanberra 后端:
    安装必须的软件:
    sudo apt-get install pulseaudio indicator-sound libcanberra-pulse libcanberra-gstreamer pulseaudio-esound-compat pulseaudio-module-bluetooth pulseaudio-module-gconf pulseaudio-module-x11 ppa-purge
    删除添加的 PPA:
    sudo ppa-purge ppa:dtl131/ppa
    sudo apt-get update

    如果还不能正常,就手工降级所有相关软件包(是挺恶心的,但是没别的办法),可以在新立得里用“本地的或陈旧的”过滤器帮你确定是哪些包。

    F. 配置 Rhythmbox 等程序使用 PulseAudio
    运行:
    gconf-editor
    找到 system/gstreamer/0.10/audio/default,将其中所有仍被设置为 osssink 的键都改为 pulsesink。

    然后把所有前面修改过使用 OSS4 的程序都换回使用 PulseAudio,重启系统。

    有用的资料:
    1. 为常见应用程序配置 OSS4:Configuring Applications for OSSv4
    2. 故障处理:OSSv4 Troubleshooting
    3. Archlinux Wiki 上的 OSS 页面:英文 中文

    Covert GBK/BIG5 encoded ID3 tag to UTF8

    For Chinese Linux users, we may meet many mp3 files with GBK/BIG5 encoded ID3 tags, which are very time consuming to change them to UTF8 one by one.

    Before using the following solution, please confirm that you won’t use media players on Windows that cannot handle UTF8 encoded ID3 tags correctly, and you won’t use MP3 players that don’t support it.

    Firstly, install python-mutagen package. For Debian/Ubuntu, use:
    $ sudo aptitude install python-mutagen
    For Fedora and others, probably:
    # yum install python-mutagen

    Secondly go to the directory containing files need to be converted.
    For files with GBK tags:
    find . -iname "*.mp3" -execdir mid3iconv -e GBK {} \;
    For files with BIG5 tags:
    find . -iname "*.mp3" -execdir mid3iconv -e BIG5 {} \;
    There is a good thing that the program could check if the encoding we selected is suitable, so when we convert GBK encoded files, the BIG5 ones won’t be changed. But please don’t use GB18030 option because it will cause problem when the file aren’t really GB18030 encoded.

    If you need to edit tag text yourself, try easytag to help you. :P

    Covert flac to mp3

    Some time we have to use mp3 format because our moveable devices commonly don’t support flac/ogg, thus I need to convert a .flac file to mp3. It’s very simple:
    First of all, install flac and lame package from your distribution’s repository.
    Then, using the following command to actually covert the file.
    1.flac -d filename.flac
    This will output an filename.wav in the same directory.
    2.lame filename.wav
    Now a fresh filename.mp3 is lying in the same directory.

    Enjoy!

    Split .ape files with cue and convert to flac

    Split .ape files with cue and convert to flac format is not so difficult.

    We do it on an Ubuntu box for example:

    First, install the dependency of shntool, flac, mac, cuetools

    sudo aptitdue install flac shntool cuetools

    and download mac package in form of deb or tarball.

    Run the following command in a terminal:

    shntool split -f FileName.cue -t '%n. %t' -o flac FileName.ape

    and the output .flac files’ name follows this sequence:

    1. Track1name.flac

    2.Track2name.flac

    Update:
    2011-02-20:
    FFmpeg supports decoding APE format since 0.5 release, and it’s very easy to convert APE to FLAC now:
    ffmpeg -i Filename.ape -acodec flac Filename.flac
    And Clementine supports CUE+APE/FLAC natively.

    This work by Aron Xu is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported.