技术开发 频道

移动应用程序 调整铃声音量,避免环境噪音

 实现

 由于 Visual C#? 2005 具有集成的移动开发平台,因此我选择它来构建我的解决方案。虽然仍旧没有用于创建桌面安装程序(可通过桌面部署 Pocket PC 应用程序)的内置向导,但这已经大大简化了 Pocket PC 的开发。市面上有一些优秀的免费工具可充当安装程序,也有一些方法可供您创建自定义的安装程序。(我将在本文稍后讨论如何构建自定义安装程序。)

 现在,让我们回到应用程序,我会将它命名为 TooLoud。创建这个应用程序须由三个部分组成:

 捕获和处理音频,我将使用 Microsoft? .NET Compact Framework 的 P/Invoke 服务。

 我将编写一个函数来计算 RMS 值。

 如果给定了平均 RMS 值,我将编写一个函数,使用 Pocket PC 上的注册表来访问和设置音量。

 您可以使用许多库和 ActiveX? 控件来访问麦克风,以记录 Pocket PC 设备的音频。我的示例构建在 P/Invoke 库(请参阅 msdn2.microsoft.com/aa446550.aspx)之上,该库包含用于访问设备麦克风的 WaveIn 类。此类包含一个结构,能够以设定的速率和位分辨率存储采样结果。P/Invoke 库还提供名为 Wave 的帮助器类,这是到 .wav 音频格式的一个通用接口。上述链接提供了在原始 WaveIn 和 Wave 类中所有已实现类和函数的列表。

 在我的解决方案中,P/Invoke 库的版本仅包含 WaveIn、Memory 和 Registry 类。为了简洁起见,所有其他类均已删除。图 2 中所示的库已通过提供额外函数而得到了扩展:一个函数位于 WaveIn (TooLoud)—AutoSetVolume—另一个函数位于 Wave—CalcRMS。

 图 2 与 TooLoud 类关系图一同显示的部分 P/Invoke 库

 应用程序运行 AutoSetVolume,后者调用 CalcRMS 作为其过程的一部分以设置音量。TestProc 可重复调用,或只调用一次,具体取决于用户界面中选择的模式。TestProc 调用六个函数:

 AutoSetVolume 用于实现最终目标。

 NumDevices 用于获取输入设备的数量。

 GetDeviceName 用于获取指定录音设备的名称。

 Preload 为给定大小和最大的音频数量(以毫秒计)预加载缓冲区。(Start 用于初始化录音时间,目前设置为一秒,Stop 用于结束当前录音。)

 AutoSetVolume 用于计算新的音量设置。

 Dispose 用于清除缓冲区。

 Preload 将设置 waveformatex 的实例、用于说明数据的标头、脉冲编码调制 (PCM) 格式标签、8 位采样分辨率、单一声道和 11025 Hz 的采样率。

 既然我能获取一段时间的音频数据块,那么我可以使用此数据来计算 RMS 值。均方根的计算见图 3 中的定义。

 图 3 响度计算的一部分

 图 4 中所示的相应代码现在可用于定义使用从麦克风中获取的采样值来计算 RMS 值的方法。由于采样值以字节格式 (0-255) 存储,因此,减去中间值 127.5 可提供 -127.5 到 +127.5 的规范化音频信号。

0
相关文章