查看“Sound”的源代码
←
Sound
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{In Progress}} [[Image:Old_Sound_Card.jpg|right|frame|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开销的几个优点: * 更容易开发声卡驱动程序——他们所要做的就是将缓冲流传输到设备,而不是担心通道、通道效果、通道音量等等。 * 跨硬件提供一致的环境 - 一款游戏将不会耗尽所有通道,所有通道效果(回声、混响等)都将得到支持。 === 声音架构 === {{In Progress}} ====简单的方法==== [[Image:Really_Simple_Audio_Architecture.png]] 这是所有架构中最简单的: 单个应用程序通过单个设备驱动程序处理单个设备。 这在基于UNIX的理念下会很好地工作:read()、write()和ioctl()都会产生立竿见影的效果。 该应用程序可以从声音设备读取多个样本,对它们进行处理(可能将它们记录到磁盘上,添加混响等), 然后将生成的声音样本写回到设备的扬声器端口上。 ==== Ring/Hub 方法==== 音频体系结构的一个更复杂的示例是基于Ring的概念。 Ring负责在系统周围传输音频信号,并且插入Ring的每个模块都以某种方式作用于信号。 每个应用程序、输入或输出、混音器、滤波器或某种插件都可以在Ring上表示,音频在Ring上传播,并被其他一些或所有Ring模块修改。 这已经在Creative的X-Fi声卡系列的硬件中成功实现; 有关更多详细信息,请参见[http://www.pcper.com/article.php?aid=177&type=expert&pid=2 这里]。 在内核中,不需要严格实现为一个Ring: Hub体系结构以不同的方式实现大致相同的效果。 '''ToDo: 描述其他方法,研究并充实这些方法。 看看今天的内核中使用了什么(关于ALSA和co如何工作的信息在没有阅读源代码的情况下只能是比较粗略的)。''' == 资源 == * [[wikipedia:Digital audio|An overview of digital audio]] * [[wikipedia:MIDI|An overview of MIDI]] * [http://www.alsa-project.org/ ALSA项目] 提供了可能对设计音响系统有用的文档,以及许多不同声卡的GPLed驱动程序。 [[Category:Sound]]
本页使用的模板:
模板:In Progress
(
查看源代码
)
返回至“
Sound
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
变体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息