Sound

来自osdev
跳到导航 跳到搜索

这个页面正在建设中! 此页面或部分内容仍在改进中,因此可能还不完整。 其内容可能会在不久的将来更改。

An example of an older-style PCI sound card

当声音没有出现时被用户才会注意到它。 它构成了用户反馈体验的一个组成部分。 例如,当用户点击错误的东西时,Windows资源管理器、KDE和其他桌面环境会发出哔哔声。 它也正在游戏和多媒体体验中更占主导的地位;许多游戏和电影现在都有5.1个通道的配乐。 因此,越来越多的爱好者自制的操作系统至少能支持声音播放。

PC声音的简短历史记录

PC上最初的音响设备是PC Speaker,最早可以追溯到IBMPC(1981年推出)。 20世纪80年代末,几家制造商开始生产附加声音设备,尤其是Creative (Game Blaster) 和AdLib (AdLib音乐合成器卡)。 其中,Creative更为成功,Sound Blaster 16在五年多的时间里成为事实上的标准。 现在几乎所有的卡都与Sound Blaster 16有一些向后兼容性。

1997年,英特尔指定了一个新标准,AC97 (“音频编解码器1997” 的缩写),该标准实际上通过指定更高质量的采样来取代了Sound Blaster标准。 2004年,英特尔又推出了另一个标准,这次是Intel High Definition Audio标准(代号为“Azalia”),它规定了对以前标准的音频质量的又一次改进。

专业(和发烧友)市场的声卡和标准已经与主流卡分开发展。 这些卡的重要功能不是花哨的功能,而是非常低的延迟 (<5ms) 和高质量的采样 (在96KHz的24位采样并不罕见)。 MIDI是当今专业音频的重要组成部分,自20世纪90年代初以来一直如此。 声卡可以从2个通道到32个或更多。

声音编程

将声音支持编程到您的操作系统中不仅仅是为已相当通用的声卡 (例如 Sound Blaster 16) 编写驱动程序,并让您的用户空间应用程序能处理它; 它需要将支持声音生成、传输(进出不同设备、应用程序甚至计算机)、混音、输出和控制的架构整合在一起,同时保持低延迟和高质量。 在这方面,有几个关键问题:

  • 您的声音传输架构应该是无损的,即32位采样应该以32位承载。 以16位携带这些样本 (例如) 会导致声音退化,因此应避免。
  • 同样的传输机制也应该为不同的采样率提供支持。 44100Hz是CD的标准,但是DVD以48000Hz的采样率携带声音。 将这两种情况间搞错,会导致扬声器发出非常奇怪的声音。 此外,在输出之前,这些将需要转换为统一采样率。
  • 两个应用程序需要同时访问声音设备。 例如,来自即时通讯程序和用户MP3播放器的通知。 操作系统的工作是将这些声音流混合在一起并产生可理解的结果。
  • 今天的音频不仅简单是立体声的,它可以是任意数量的通道。 较简单的应用程序仍然使用单声道声音,而DVD和高清晰度电影的声道分别为5.1和7.1声道。 您的操作系统将需要能够将声音路由到这些通道中的任何一个,并决定在较大的通道集中放置单声道和立体声声音的位置。 此外,MIDI音频还需要在设备和应用程序之间正确路由。
  • 声音和游戏图形一样,必须实时完成。 由随机硬盘或CPU使用率引起的音频跳音是“非常”明显的。 不幸的是,简单地增加缓冲区大小并不总是最好的解决方案,因为这会导致人们收听新录制的音频 (行业中的 “监听”) 遭到延迟。

一些(但不是全部)声卡将具有允许在硬件中完成部分处理的功能。 简单的混合和采样处理是专用硬件最常见的独有功能。

某些应用程序 (例如游戏) 将尝试使用最大数量的通道。 较旧版本的Windows允许应用程序对声音硬件进行“独占”控制,以获得低延迟的声音和有保证的通道。 但是,由于Windows Vista的所有声音(包括音量)都是软件混合的,支持无限数量的通道。

混合所有声音的软件具有很少CPU开销的几个优点:

  • 更容易开发声卡驱动程序——他们所要做的就是将缓冲流传输到设备,而不是担心通道、通道效果、通道音量等等。
  • 跨硬件提供一致的环境 - 一款游戏将不会耗尽所有通道,所有通道效果(回声、混响等)都将得到支持。

声音架构

这个页面正在建设中! 此页面或部分内容仍在改进中,因此可能还不完整。 其内容可能会在不久的将来更改。

简单的方法

Really Simple Audio Architecture.png

这是所有架构中最简单的: 单个应用程序通过单个设备驱动程序处理单个设备。 这在基于UNIX的理念下会很好地工作:read()、write()和ioctl()都会产生立竿见影的效果。 该应用程序可以从声音设备读取多个样本,对它们进行处理(可能将它们记录到磁盘上,添加混响等), 然后将生成的声音样本写回到设备的扬声器端口上。

Ring/Hub 方法

音频体系结构的一个更复杂的示例是基于Ring的概念。 Ring负责在系统周围传输音频信号,并且插入Ring的每个模块都以某种方式作用于信号。

每个应用程序、输入或输出、混音器、滤波器或某种插件都可以在Ring上表示,音频在Ring上传播,并被其他一些或所有Ring模块修改。 这已经在Creative的X-Fi声卡系列的硬件中成功实现; 有关更多详细信息,请参见这里

在内核中,不需要严格实现为一个Ring: Hub体系结构以不同的方式实现大致相同的效果。

ToDo: 描述其他方法,研究并充实这些方法。 看看今天的内核中使用了什么(关于ALSA和co如何工作的信息在没有阅读源代码的情况下只能是比较粗略的)。

资源