Rockbox
首先,我要消除你们的一个误解,即 Rockbox 是某种 Linux 的变种,或者它最初是那样开始的。它不是。当然,您正在阅读 Linux Journal,因此您可能会认为它是,但我只是想从一开始就确保您知道它不是。 撇开这个小小的形式,让我继续介绍它实际上是什么,它是一个不断增长的数字音频播放器的替代固件。
大约在 2001 年,Rockbox 最初只是一个数字音频播放器 (DAP) 的替代固件,即 Archos Jukebox(有时称为 Archos Player,图 1)。一些早期设备的拥有者对设备自带的错误百出的固件感到不满意,并且觉得它缺少一些重要的功能。这些人决定他们可以做得更好,于是 Rockbox 诞生了。与现代 DAP 相比,最初的设备在功能上非常有限。它配备了一个非常慢的 11MHz CPU,因此,必须包含一个专用芯片来解码 MP3 音频。这意味着在 Rockbox 的早期,它唯一可以播放的音乐格式仅限于 MP3 或未压缩的 PCM 音频 (WAV)。如今,这个列表已经大大扩展,固件现在可以播放大约 27 种格式。我们这些与该项目相关的人员非常有信心(甚至有点自鸣得意),这远远超过了世界上任何其他人制作的任何固件,无论是开源的还是闭源的。

图 1. 原始 Archos Player(摄影师:Björn Stenbeg)
当然,除了现在支持这个相当庞大且在不少情况下是深奥的格式列表之外,Rockbox 现在也在种类繁多的播放器上运行。多年来,支持的 DAP 列表稳步增长,iRiver H100 系列是 2004 年左右添加的第一个软件编解码器目标,从那时起,它扩展到包括 Apple、Archos、Cowon、iRiver、Logick、Meizu、MPIO、Olympus、Onda、Packard Bell、Philips、Samsung、SanDisk、Tatung 和 Toshiba 等其他制造商生产的播放器。在这些播放器中,Rockbox 必须运行的架构也必然得到了扩展,从 Archos 播放器中的原始 SH1 到 ColdFire、ARM 甚至 MIPS 硬件。
将 Rockbox 移植到新的播放器是一项耗时的工作,这样做从非常困难到几乎不可能不等。播放器在此难度等级中的位置取决于许多因素,但主要影响因素往往是制造商让自定义代码在设备上运行的容易程度,以及底层硬件存在多少文档。在 Rockbox 运行的许多播放器上,硬件的逆向工程完全是由 Rockbox 黑客完成的;然而,非常感谢 iPodLinux (IPL) 项目,如果没有他们对早期运行 PortalPlayer 硬件的 iPod 进行的广泛逆向工程,目前 Rockbox 移植到这些播放器可能是不可能的。
PortalPlayer 平台在嵌入式黑客中以没有公开可用的文档而臭名昭著,因此使用它的设备上的每一项功能都必须经过艰苦的努力才能解决,而 IPL 黑客在这方面花费了大量时间。回到关于运行自定义代码有多容易的第一个要点,更新的 iPod(实际上自第二代 iPod Nano 以来)已经将门槛提高得更高,因为设备要求它执行的代码在运行之前必须在硬件中进行签名和加密。早在 Apple 推出这款设备时,Rockbox 社区对其是否有可能移植到其上抱有非常低的希望。然而,去年原始固件中出现了一个漏洞,使得一些非常有才华的人能够运行代码,现在 Rockbox 也移植到了该设备上。事实证明,其他平台更容易一些——例如,东芝 Gigabeat F 拥有相对容易获得的硬件文档。
Rockbox 的驱动理念始终是提供尽可能最佳的便携式音乐播放器体验。正如之前提到的,27 种编解码器只是其中的一部分。虽然它允许最终用户通过基于音乐元数据内容构建的数据库来导航他们的音乐收藏,但它最初只是从文件浏览器开始的——这个功能仍然是 Rockbox 项目核心团队的最爱。播放音乐的每个操作都需要一个播放列表,因为这就是 Rockbox 的工作方式。播放列表的创建可以在最终用户甚至没有意识到的情况下即时完成。或者,它们可以在 Rockbox 本身内部或在用户最喜欢的音乐管理程序中手动构建,假设它可以生成标准的 M3U 格式文件。
该固件提供的另一个关键功能是书签——对于那些听有声读物并且需要跟踪他们在关闭播放器时在文件中的位置的人来说,这非常宝贵。Rockbox 允许用户保留许多这样的书签,让他们可以轻松地在多个文件之间跳跃。
Rockbox 中最古老的功能之一,并且随着时间的推移只会不断改进,是可自定义的正在播放屏幕 (WPS)。在 Rockbox 非常早期的纯文本版本中,这允许用户选择他们希望显示哪些关于当前播放曲目的信息。在最新版本的 Rockbox 中,现在允许用户决定在何处显示专辑封面,或者是否显示专辑封面,以及所有各种元数据,或者拥有色彩鲜艳的背景以及几乎任何他们想要的东西(图 2)。
另一个受欢迎的功能,特别是对于视力障碍的 Rockbox 用户,是语音反馈系统的实现。一旦启用此功能,Rockbox 界面中的所有菜单都会向用户宣布自己,因此可以在无需查看屏幕的情况下导航整个界面。在默认状态下,这也允许播放器拼写出文件名,以便用户可以导航他们的音乐收藏。可以通过使用 speex 格式的 .talk 文件进一步增强此功能,这些文件是使用基于 PC 的工具预先生成的,并允许播放器实际说出文件和目录的名称。
最近几年添加的一个稍微更新的功能为大量受支持的 Rockbox 播放器带来了电影播放功能。一旦您转码了您选择的电影并调整其大小以适合设备的屏幕,您就可以随意观看 MPEG1 和 MPEG2 电影,这一切都由 Rockbox 丰富的插件 API 实现。
我在此处强调的功能几乎没有触及 Rockbox 可能实现的功能的表面,如果您有兴趣了解更多信息,请查看 Rockbox 主页上提供的相当全面的手册 (www.rockbox.org)。如果没有站在许多其他开源巨人的肩膀上,该项目不可能提供所有这些功能。Rockbox 使用的许多编解码器都源自其他开源代码库。提供这些代码的人们通过提供无数小时的工作帮助了我们,Rockbox 正是在此基础上构建的。Libmad、ffmpeg、flac、vorbis、speex、wavpack、libmpeg2 和 libmtp 只是其他一些团队,他们都值得当前 Rockbox 用户群的衷心感谢,因为没有他们,他们几乎所有喜欢的音乐都无法在 Rockbox 平台上播放得如此出色。

图 2. Rockbox 默认主题使用的正在播放屏幕
Rockbox 很幸运地在过去几年中被 Google Summer of Code 计划接受,今年也不例外。谷歌雄厚的资金慷慨资助的最有趣的项目之一可能是“Rockbox as an Application”或 RaaA。
越来越多能够播放音乐的消费电子设备已经配备了功能非常强大的操作系统,仅仅为了在这种设备上获得卓越的音乐播放效果而替换整个操作系统是没有意义的。由于 Rockbox 存储库中长期以来一直存在构建“Rockbox 模拟器”的代码,该模拟器使用 SDL 在 PC 上运行,因此已经存在将此转变为可以在 Android、Symbian、Maemo 甚至 Windows Mobile(天哪!)上执行的真实应用程序的机会,现在正在付诸行动。该项目的目标是将播放引擎与代码的固件部分分离开来,允许您在手机上安装 Rockbox,而不会牺牲其拨打电话或浏览网络的能力。人们认为这比尝试在您的手机上添加网络堆栈以及使 Rockbox 成为令人信服的替代操作系统的所有其他好东西要好。实际上,几年前有人以这种方式 Fork 了 Rockbox 的模拟器,用于摩托罗拉 RockR 系列手机,但遗憾的是,负责此移植的人员从未将任何像样的代码返回给项目,并且该特定目标集在 Rockbox 代码库的主干中仍然不受支持。
Rockbox 的大部分代码库是用 C 语言编写的,但也有少量例程是用汇编代码编写的,这在最大限度地榨取播放器的性能方面是有意义的。这些例程大部分都在编解码器中,在编解码器中,每一时钟周期都很重要,尤其是一些重量级格式,例如 Monkey's Audio,即使是最强大的 Rockbox 播放器在最大压缩率下也难以处理。
Rockbox 内核是从头开始编写的,在其功能中,有两件事可能会让熟悉其他现代操作系统内核的人们感到非常不同。首先,由于绝大多数支持 Rockbox 的 DAP 都不具备 MMU,因此 Rockbox 的内核不具备任何动态内存分配方法。长期以来,这一直是 Rockbox 社区中一个有争议的问题,新的开发人员不断提出这个问题。当然,缺少 MMU 并非完全是障碍。完全有可能提出一种不需要 MMU 的 malloc 实现,这通常是他们提出的观点。该项目历史上一直抵制它,并且至今仍在继续这样做,原因是任何实现都需要一个可从中分配的空闲内存池。Rockbox 老卫队都认为这会浪费 Rockbox 执行的通常内存极其受限的平台上的宝贵资源,并且应该使用每一块可用内存来缓冲尽可能多的音乐。这意味着第一次为 Rockbox 编程的人必须习惯于考虑在编译时静态分配他们需要的所有内存,这是一种对于当今大多数开发人员来说陌生的编程模式。
Rockbox 内核中的第二个有趣的功能是线程模型,它是协作式的而不是抢占式的。这主要是当今的历史遗留物,并且已经反复讨论过转向抢占式模型,但到目前为止尚未达成结论。与此同时,这意味着,同样,任何旨在在 Rockbox 内核上运行的东西都必须仔细考虑其执行,并且如果它要与系统的其余部分良好配合,则必须在适当的时候自觉地让位于其他线程。
如前所述,Rockbox 提供了丰富的插件 API,可以通过编译后的 C 代码使用,也可以通过最新版本中不断增长的 LUA 函数库使用。一些支持程序也与 Rockbox 一起提供,其中最重要的是 Rockbox Utility,这是一款多平台安装工具。它是使用 Qt 工具包用 C++ 编写的,并且以静态链接形式维护了适用于所有三个主要 PC 操作系统的版本,以使其尽可能易于使用。目前有大约 92 人被列为拥有 Rockbox 中央 Subversion 存储库的提交访问权限,其中 40 人目前处于活跃状态。除了他们之外,还有一个相当大的补丁作者、艺术家和一般帮助者社区,为项目的健康及其充满活力和友好的氛围做出贡献。
对于那些不擅长使用文本编辑器和编译器的人来说,始终欢迎对文档进行添加和维护。虽然声称文档是完美的可能是愚蠢的,但大多数参与该项目的人都会说,就大多数开源项目而言,文档已经相当不错了。除了手册和 Wiki(提供项目的静态文档)之外,还有许多其他方式供人们查找和获得帮助。有两个活跃的邮件列表,一个面向最终用户,事实证明,对于盲人用户社区来说,这可能是最受欢迎的支持选择,另一个邮件列表供那些对 Rockbox 开发感兴趣的人交流想法。Rockbox 论坛也非常活跃,事实上,许多 Rockbox“工作人员”都是通过在这里帮助其他人而进入社区的。与大多数其他开源项目一样,在 Freenode 网络 (www.freenode.net) 上也有一个非常活跃的 IRC 频道——#rockbox 由于社区多样化的地理位置(有些人可能会说是失眠!)性质,几乎全天都很活跃。该频道被记录下来,以确保所有讨论都可搜索,以防开发人员错过一些关键或其他有趣的内容,并且这些日志会发布在项目的网站上。此外,永远不要说 Rockbox 社区采用新技术的速度很慢。最近,@rockboxcommits 已在 Twitter 上首次亮相,供那些热衷于跟踪源代码存储库中每一项更改的人使用!
Bryan Childs 是伦敦一家金融服务软件公司的系统经理。他喜欢鸡尾酒,并且只要离开办公室就会表现得不光彩。他可以将冷冻鸡蛋扔过十层楼高的建筑物。