Welcome

首页 / 软件开发 / .NET编程技术 / WPF应用程序中的发声功能

WPF应用程序中的发声功能2011-08-20 MSDN Charles Petzold几个星期以前,我坐在一辆崭新的丰田普锐斯汽车中,听着租车公司的销售代理讲解着仪表盘上遍布 的陌生控制开关和指示器。“哇,”我想,“虽然技术和车一样都那么陈旧了,制造商仍继续美化着用 户界面”。

从最广义的层面上说,用户界面是人机交互的地方。虽然这一概念与技术本身一样历史悠久,但用户 界面作为一种艺术形式大放异彩倚仗的却是个人计算机革命。

现在,恐怕只有很小一部分个人计算机用户能够记得 Apple Macintosh 和 Microsoft Windows 图形 用户界面问世之前的情形了。当时,也就是 80 年代中晚期,一些专家曾担忧用户界面的标准化会导致 应用程序千篇一律,单调乏味。但事实并非如此。相反,随着标准控件的推出卸下了设计者和编程者需 要自创滚动条的负担,用户界面实际上开始发生变革并变得愈发有趣起来。

就此而言,Windows Presentation Foundation (WPF) 所引入的新模式让用户界面更加光彩。WPF 为 保留模式图形、动画和 3-D 奠定了坚实的基础。在此基础上,它增加了父子元素树状层次结构以及一种 称为 XAML 的强大标记语言。结果在通过模板化功能自定义现有控件以及通过组装现有组件构建新控件 方面,都实现了无与伦比的灵活性。

而且,这些新概念不仅仅用于客户端编程。XAML 和 WPF 类是 Microsoft .NET Framework 的健壮子 集,目前通过 Silverlight 即可用在基于 Web 的编程中。您已迎来在客户端应用程序与 Web 应用程序 之间真正共享自定义控件的新时代。我确信在利用多点触控等新技术的同时,这种势头会发展到移动应 用程序,并最终涵盖各种各样的信息和娱乐系统。

基于这些原因,我相信用户界面已成为应用程序编程中更加关键的部分。本专栏将探讨 WPF 和 Silverlight 中用户界面设计的潜能,包括在可能的情况下使用跨平台代码。

前奏

用户界面选择的好与坏并非总是一目了然。Microsoft Office 97 中首次引入的人性化活页夹 Clippy 在当时看可能是一个非常不错的创意。因此,我将更专注于技术性潜能而不是设计潜能。我将避 免使用“最佳做法”一词,这个词更适合用在历史和市场环境。

有一个比较好的现成惯例:计算机若非为响应特定用户命令而播放视频或声音文件,就不该发出任何 声音。我打算打破这一限制,在此向您介绍如何通过在运行时生成波形数据,在 WPF 应用程序中播放自 定义声音。

虽然此发声功能尚未正式纳入 .NET Framework 之中,但可通过 Codeplex (naudio.codeplex.com) 上提供的 NAudio 库来实现。通过该站点中的链接,您可以到 Mark Heath 的博客中查看一些示例代码 ,还可以查看 Sebastian Gray 的站点教程。

可以在 Windows 窗体或 WPF 应用程序中使用 NAudio 库。由于该库通过 PInvoke 访问 Win32 API 函数,因此不能用于 Silverlight。

在本文中,我使用的是 NAudio 1.3.8 版。当您创建使用 NAudio 的项目时,需要将其编译为可进行 32 位处理。请转至“属性”页的“生成”选项卡,并从“平台目标”下拉列表中选择 x86。

虽然该库为需要使用声音的专业化应用程序提供了许多功能,但我向您演示的使用方法可能适合更通 用的应用程序。

例如,假设您的应用程序允许用户在窗口上四处拖动对象,而您希望伴随拖动播放一个简单的声音( 比如一个正弦波),而该声音的频率随着对象到窗口中心距离的增加而提高。

这就是波形音频要做的工作。

如今,几乎所有 PC 都带有发声硬件,该硬件通常通过主板右侧的一两个芯片实现其功能。一般来说 ,此硬件无非就是一对数字模拟转换器 (DAC)。当向这两个 DAC 传送描述波形的恒定整数流时,就会发 出立体声。

那么会涉及多少数据呢?现在的应用程序一般生成“CD 音质”的声音。采样率是恒定的每秒 44,100 个样本。(Nyquist Theorem 指出采样率须至少为最高频率的两倍时才能重现声音。惯常的说法是人耳 能够听到频率介于 20Hz 与 20,000Hz 之间的声音,因此 44,100 可谓充裕。)每个样本都是一个有符 号 16 位整数,即一个表示 96 分贝信噪比的大小。