65.9K
CodeProject 正在变化。 阅读更多。
Home

LED 风格音量计使用 DirectX

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.59/5 (14投票s)

2007年9月14日

CPOL

5分钟阅读

viewsIcon

131521

downloadIcon

9801

一个基于 DirectX 的音频音量表,模拟声卡上的 LED 面板。

Screenshot - AnalogSignalMeterSample.jpg

引言

本文档是对我创建的一个名为 AnalogSignalMeter 的 UserControl 的使用手册。该控件使用 Direct3D 来绘制控件,并使用 DirectSound 来采样音频信号。

背景

我是我教会的音响技术员,目前正在开发一些软件。我需要一个信号电平表。我决定自己做一个,这就是结果。

演示

演示程序是一个基本的窗体,展示了该控件。还有一些控件可以让你修改控件的属性。

AnalogSignalMeter 公共属性

以下属性可供您修改

  • BackgroundColor
  • LowLedColor
  • MidLedColor
  • HighLedColor
  • LowLedCount
  • MidLedCount
  • HighLedCount
  • LedHeight
  • LedWidth
  • LeftMargin
  • RightMargin
  • BottomMargin
  • TopMargin
  • LeftRightSeperation
  • UpDownSeperation
  • DisplayOrientation
  • AudioDisplayMode
  • MeterMode
  • SampleFrequencyMilliseconds
  • AutoStart
  • ClearMeterOnStop

BackgroundColor 和三个 LedColor 属性非常直观。它们控制着仪表的颜色。三个 LedCount 属性控制着每种不同 LED 级别的最大数量。LedHeightLedWidth 控制着每个单独 LED 的尺寸。这些属性相对于控件的 Orientation。四个 Margin 属性控制着 LED 和控件四个边缘之间的间距。它们也相对于控件的 OrientationLeftRightSeperationUpDownSeperation 控制着每个 LED 之间的间距。这些属性也相对于控件的 Orientation

DisplayOrientation 有四种可能性:HorizontalHorizontalReverseVerticalVerticalReverseHorizontal 从左到右绘制 LED,从小到大。HorizontalReverse 与此相反。Vertical 从上到下绘制 LED,从小到大。VerticalReverse 与此相反。文章顶部显示的布局是 Horizontal。模拟声卡仪表最常见的布局是 VerticalReverse

AudioDisplayMode 有两种可能性:StereoMonoStereo 为左声道和右声道采样不同的电平。Mono 为左声道和右声道采样相同的电平。

MeterMode 有三种可能的值:AudioSignalRandomLevelsSpecificLevelsAudioSignal 告诉仪表以标准模式运行,从音频缓冲区捕获电平。RandomLevels 告诉仪表报告随机生成的电平。SpecificLevels 告诉仪表持续报告相同的电平。

SampleFrequencyMilliseconds 控制控件采样信号电平的频率,单位是毫秒,即千分之一秒。默认值,也是可能最好的值,是 100。不过,请随意根据自己的喜好进行试验。

AutoStart 告诉控件是否在应用程序加载时启动。默认情况下,此设置为 false。我这边还需要做一些调整,下一版本会修复。

ClearMeterOnStop 告诉控件停止时是否将仪表重置为零。

以下是您可以访问的只读属性。

  • MeterRunning
  • TotalLedCount
  • LeftLevel
  • RightLevel

MeterRunning 简单地告诉您仪表是否正在运行。TotalLedCount 返回 LED 的总最大数量。LeftLevelRightLevel 允许您读取上次采样的音量。

AnalogSignalMeter 公共方法

有四种方法可供您使用

  • StartMeter()
  • StartRandomMeter()
  • StartSpecificMeter(int leftLevel, int rightLevel)
  • StopMeter()

StartMeter 将启动仪表并开始从声卡采样信号。StartRandomMeter 将启动仪表,并开始为其提供随机电平。StartSpecificMeter 将启动仪表,并反复为其提供恒定的静态电平。StopMeter 将停止仪表,如果 ClearMeterOnStoptrue,则电平将重置为零。

您可能永远不需要最后两种启动方法,但当您开始注意到仪表行为异常时,它们对于故障排除很有用。

AnalogSignalMeter 事件

控件会触发三个事件

  • ReportLevel
  • LeftSignalPeak
  • RightSignalPeak

ReportLevel 在每次获取新样本时触发。它有自己的 EventArgs,其中包含两个电平,args.LeftLevelargs.RightLevel

LeftSignalPeakRightSignalPeak 在采样电平等于 LED 总数时触发。这很有用,因为这意味着音频信号可能失真,质量会下降,并且应该降低输入信号的增益。此事件有自己的 EventArgs,其中包含峰值通道 args.Channel 以及一条消息 args.Message

AnalogSignalMeter 技巧

如上所述,AutoStart 需要调整。如果您希望仪表自动启动,请在设计阶段将 AutoStart 设置为 true,然后让您的窗体检查属性,并相应地调用 StartMeter 方法。

如果您不喜欢仪表的样式但想要其功能,还有一种替代方法,您可以在演示应用程序中查看。您可以将控件的可见性设置为 false,并在您的 ReportLevel 处理程序中,使用这些电平来设置进度条的值。将进度条的最大值设置为 TotalLedCount 值,然后让 ReportLevel 事件处理程序将进度条的值设置为 args.LeftLevelargs.RightLevel 值。您可以为每个通道设置一个单独的进度条。CodeProject 上有人提供了一个漂亮的渐变式进度条。它可以用来模拟较低或较高信号电平的单独颜色值。

历史

2007年9月21日 - 发布新版本

我已上传了 BuckSoft.DirectSound 和 AnalogSignalMeterDemo 的新版本。

BuckSoft.DirectSound

  • 添加了一个新的公共属性 MeterMode,以及它的枚举值。此属性告诉仪表以音频信号模式、随机电平模式或特定电平模式运行。缺少此属性是仪表在更改演示属性时总是会重新启动到随机模式的原因。

AnalogSignalMeterDemo

  • 修复了“总是重新启动到随机模式”的错误。
  • 演示中的进度条更新和电平标签更新是通过不安全线程调用处理的,现已修复。
  • 修复了增加 LedCounts 时导致崩溃的错误

2007年9月17日 - 添加了完整的源代码

在我最初发布时,我疏忽了没有发布该控件的完整源代码。现在它已经可用了。

2007年9月14日 - 首次发布

欢迎您提出添加或改进的建议。我刚接触 C# 和 DirectX,欢迎任何人提供见解。

免责声明

此控件可免费使用和重新分发。它仍在开发中。请自行承担风险使用。

© . All rights reserved.