构建多房间数字音乐系统
和许多当今的媒体爱好者一样,我在家里有一台媒体中心电脑。这是一个小型 VIA M10000 Mini-ITX 系统,装在一个 Casetronic C158 机箱中,运行着基于 Gentoo Linux 的 Freevo。它放在我的媒体柜里,为我的电视提供音乐、视频、照片和各种其他信息。这个小型媒体中心的所有内容都来自一台更大的 AMD64 Gentoo Linux 服务器,该服务器位于房屋后方附近的壁橱里。两台机器通过有线网络使用 NFS(网络文件系统)进行通信。我首先要告诉你,以数字格式存储所有音乐、视频和照片并且易于访问是非常棒的。
本着与我的媒体中心电脑相同的精神,我想要拥有几个小型系统,可以放在架子上或抽屉里,为房屋的不同部分提供音乐。市场上有许多产品可以从计算机广播音频,还有许多其他产品可以播放生成的流。对我来说,这些产品的大多数问题在于只有一个流可用。我希望能够在每个房间同时播放不同的音乐,并使用一个设备进行控制。市场上的一些新来者确实做到了我想要的功能——即 Sonos 数字音乐系统,该系统在 2006 年 3 月号的Linux Journal 上进行了评测。但是,我想自己解决这个问题。
我的想法是构建一个无风扇 Mini-ITX 设备,它可以从我的文件服务器获取内容,并使用 MPD(音乐播放器守护程序)播放。为了控制该设备,我使用了 lightTPD(一个启用 PHP 的 Web 服务器)和 phpMp(一个控制 MPD 的 PHP 应用程序),它们都运行在该设备上。这使网络上任何带有 Web 浏览器的计算机都具有控制该设备的能力。我选择的控制器是 Nokia 770。使用预装的 Opera 浏览器,我可以将浏览器指向每个设备,并通过我的无线网络控制它们。
对于该设备,我选择从 VIA ML6000EA Mini-ITX 主板开始。该主板具有许多使其非常适合此类设备的特性。主要特性是 VIA 600MHz Eden 无风扇处理器。这个微小的处理器足以推动应用程序运行,并且绝对没有噪音。其他不错的特性包括六声道板载音频、板载 LAN、对 1GB 内存的支持和一个 PCI 插槽。
因为我希望该设备是静音的,所以我决定放弃标准硬盘驱动器。相反,我选择了 256MB 闪存驱动器,它可以直接插入 40 针 IDE 插槽。闪存驱动器也从标准的四针 Molex 连接器获取电源。我还添加了 256MB DDR 400 内存来完成内部组件。
为了使该设备外观时尚,我选择了 Casetronic C158 机箱。这款机箱正面光滑,使其看起来更像一个电器设备。即使这款机箱有空间容纳一个超薄 ROM 驱动器,我也没有安装,因为 MPD 不支持从 CD 播放音频。这款机箱的正面右侧还带有音频插孔,可以方便地使用耳机欣赏音乐。这款机箱的另一个不错的特性是可选的 CompactFlash 读卡器,可以从内部安装,并可以从 CD-ROM 托盘下方访问。
因为我选择使用基于闪存的硬盘驱动器,所以我需要确保我的 Linux 安装包很小,小于 250MB,并且不写入磁盘。基于闪存的驱动器和磁盘只有一定数量的写入周期,超过这个周期它们就会失效。我使用的特定驱动器,由 IEI Global Sourcing 制造,支持超过一百万次循环。即使支持这么多次循环,由于磁盘写入,驱动器也会在相当短的时间内停止工作,特别是如果磁盘上有交换分区的话。考虑到所有这些因素,我决定嵌入式 Linux 系统是最合适的。
嵌入式 Linux 系统可以通过多种方式创建。我选择使用嵌入式 Gentoo(请参阅资源)。因为我的开发机器,一台 Dell 600m 笔记本电脑,已经运行了 Gentoo,所以我不需要创建自定义构建链。我只需从 Gentoo 网站获取一个快照,并将我的笔记本电脑用作主机来构建嵌入式系统。
在我尝试构建系统之前,我仔细研究了 Karim Yaghmour 撰写的Building Embedded Linux Systems(请参阅资源)。这本书非常详细地介绍了构成功能性 Linux 操作系统的确切组成部分。而且,正如书名所示,它向读者展示了如何构建嵌入式 Linux 系统。我还遵循了 Heath Holcomb 撰写的关于如何构建嵌入式 Gentoo 系统的说明(请参阅资源)。Heath 的说明描述了构建嵌入式 Gentoo 系统并使其运行所需的所有步骤。如果没有这些资源,整个项目是不可能实现的。如果您正在考虑使用嵌入式 Linux 做任何事情,我强烈建议您看看它们。
还应该注意的是,如果您想构建像这样的设备,但宁愿使用硬盘驱动器并节省一些时间,您可以使用几乎任何 Linux 发行版。它们中的大多数都带有此项目所需的所有软件,并且已经包含在它们的软件包系统中。
构建嵌入式 Gentoo 系统并不太困难。如果您以前安装过 Gentoo,那么跳入嵌入式领域并不难。尽管如此,有几件事使我的构建过程变得有趣。
我完全按照 Heath 的说明进行操作,当我完成时,我得到了一个可以工作的嵌入式 Gentoo 系统。在测试它并确保一切正常工作后,我继续安装了我需要的其余软件(MPD、lightTPD 和 phpMp)。这证明有点问题。Portage(Gentoo 的软件包系统)想要安装几个我不需要或不想要的软件包。因此,我从头开始,仔细地只安装了我需要的软件的依赖项。然后,我使用 nodeps 标志安装了我的三个软件,以确保我没有获得不需要的软件。
在构建过程中,我多次测试了系统。我想确保每一步我都在取得进展,而不是破坏以前工作正常的东西。为了测试系统,我使用 USB 媒体读取器将嵌入式 Gentoo 系统从我的笔记本电脑复制到 CompactFlash 卡上。然后,我将 CompactFlash 卡插入直接插入我的设备计算机的读卡器中。这使我可以测试该设备,并模拟一切正常工作后的运行方式。
正如我之前提到的,我的所有媒体都在文件服务器上。以这种方式存储我的媒体使我的网络上的任何数量的计算机都可以访问这些文件,就像它们存储在本地一样。为了共享文件,我在服务器上设置了 NFS。使用 NFS,我可以允许 IP 地址或 IP 地址集连接到服务器上的特定目录,并具有特定的安全规则。
对于设备计算机,我设置了两个共享。主共享是所有音频内容存储的地方。此共享是只读的;我不希望任何挂载此目录的内容都能够修改它。第二个共享是一个可写共享,其中存储了所有 MPD 元数据(稍后会详细介绍)。这两个共享都设置为仅 IP 限制。出于简单性的考虑,我决定不使用用户身份验证。
为了完成服务器上的网络设置,我确保 NFS 在启动时启动。然后,我将挂载行添加到设备上的启动脚本中。
MPD 是该设备的核心。MPD 可以播放几乎任何音频格式:MP3、Ogg、AAC(不带 DRM)、FLAC 等等。对于我的设置,我启用了 Ogg、MP3 和 AAC,因为我的所有音乐文件都是这些格式之一。MPD 还可以播放音频流。这使我的设备能够播放我所有喜欢的 Internet 广播电台。配置 MPD 实际上非常容易。只需更改少量设置即可使 MPD 正常工作。
需要更改的两个最明显的设置是 music_directory 和 playlist_directory。我将音乐目录设置指向第一个 NFS 挂载点(包含所有音频文件的那个)。播放列表目录设置指向第二个 NFS 挂载点上的播放列表目录。通过将播放列表设置指向一个公共目录,网络上的所有设备都可以共享播放列表。
我修改的下一个设置是 db_file。此设置指向一个文件,MDP 在该文件中存储有关系统上音频文件的所有元数据。我将此设置指向可写 NFS 共享上的一个名为 mpd.db 的文件。就像播放列表设置一样,这允许所有设备共享一个公共的音频信息数据库。这也允许任何设备更新 MPD 数据库。
我修改的最后一个设置是 state_file。此设置指向一个文件,该文件保存有关 MPD 停止时所处状态的信息。同样,这指向可写 NFS 挂载点上的一个文件。但是,状态文件对于每个设备都是唯一的。当我重新打开一个设备时,我想要它的状态,而不是另一个设备的状态。
因为该设备没有屏幕,所以我需要一种控制音频播放的方式。幸运的是,开发 MPD 的同一批人也开发了 phpMp。phpMp 是一个小而简单的 Web 应用程序,旨在通过 PHP 中的套接字扩展来控制 MPD 的实例。为了使 phpMp 运行,我必须安装一个 Web 服务器。因为我使用的是嵌入式平台,所以我必须注意应用程序的大小。我还想要一些非常容易配置且不占用太多资源的东西。因此,考虑到这些因素,我决定使用 lightTPD。lightTPD 是一个小巧、快速、功能齐全的 Web 服务器,可以运行 PHP 脚本。
开箱即用,lightTPD 和 phpMp 几乎不需要配置,这是一个很棒的功能。当然,因为该设备是无头的,所以我必须确保 lightTPD 在启动过程中自动启动。
考虑到所有因素,我在使一切正常工作方面遇到的问题很少。我遇到的少数问题与操作系统是嵌入式系统有关。幸运的是,它们很容易解决。
第一个问题是应用程序日志记录。默认情况下,MPD、lightTPD 和操作系统本身都被配置为将所有内容记录到文件中。由于我的硬盘驱动器以只读方式挂载,这导致了一些问题。为了解决这个问题,我在 fstab 中添加了一行,将 /tmp 目录挂载为 tmpfs。然后,我将所有日志重定向到 /tmp 目录。这样做允许所有应用程序记录信息,并且仍然具有只读文件系统。
我遇到的下一个问题与 ALSA(高级 Linux 声音架构)设备文件有关。如今,大多数 Linux 系统都使用 UDEV 在启动时动态创建设备文件。在 UDEV 创建的设备文件中,有 ALSA 使用的声卡设备文件。因为我的系统没有 UDEV,所以这些文件永远不会被创建。为了解决这个问题,我手动创建了我需要的设备文件,并将它们作为我的嵌入式发行版的一部分。
最后一个挑战是关闭设备。因为没有控制台或界面来告诉系统关机,所以您必须使用设备上的电源按钮。这促使我在嵌入式系统中构建 ACPI(高级配置和电源接口)支持。通过 ACPI,我将系统配置为在按下电源按钮时关机。由于操作系统非常小,并且运行的进程很少,因此关机只需一瞬间。最终,我想在 phpMp 界面中添加关机支持,但目前,电源按钮工作得很好。
在构建此系统的过程中,我想到了几件我想做的事情来增强该设备,例如在机箱正面添加一个 LCD,以显示当前曲目的艺术家、专辑和名称。LCDproc 支持 MPD,LCD4linux 正在添加支持,因此安装 LCD 应该是微不足道的。我还想构建一个小型的放大器,可以放入机箱中,这样我就不必使用有源扬声器。我的想法不仅限于该设备本身;我还想到了一些我想在 Nokia 770 和 MPD 中看到的增强功能。
Nokia 770 是此设备的完美界面。随着其用户群的增长,其功能和可以运行的应用程序数量也在增长。世界各地的开发人员每天都在将越来越多的应用程序移植到它上面。将来,我希望看到 gmpc(GNOME 音乐播放器客户端)被移植。gmpc 是一个 GTK+ 应用程序,可以连接和控制 MPD。如果 gmpc 被移植到 Nokia 770,则不再需要 lightTPD 和 phpMp 来控制该设备。770 可以本地控制它。
我还希望看到添加到 MPD 中的一些增强功能,以使该设备更好。第一个是封面艺术插件。添加对此功能的支持已在 MPD 开发人员中讨论过,但迄今为止尚未添加。另一个不错的补充是标签编辑器,它允许用户更新存储在音频文件中的元信息。
Mini-ITX 系列主板与 Linux 相结合,为构建各种设备(如本文中描述的设备)提供了坚实的基础。我花了不到一个月的时间来构建和测试该设备。对于如此小的东西来说,它也相当便宜。该设备的所有硬件成本约为 320 美元。
我要感谢我的好朋友 Ryan Corder 在整个过程中对我的帮助。他在教我 Gentoo 和 Linux 系统的更精细方面发挥了重要作用。该设备的所有零件都是从 Logic Supply(请参阅资源)购买的,并且发货速度非常快。
资源
嵌入式 Gentoo:embedded.gentoo.org
构建嵌入式 Linux 系统:www.oreilly.com/catalog/belinuxsys
Gentoo 嵌入式 x86 指南:www.bulah.com/embedded-guide.html
Logic Supply:www.logicsupply.com
Chad Files 是居住在阿肯色州康威市的软件开发人员。他是一位狂热的徒步旅行者和长期的 Linux 用户。欢迎您通过 cpfiles@gmail.com 发表评论。