LED 风格音量计使用 DirectX
一个基于 DirectX 的音频音量表,模拟声卡上的 LED 面板。
引言
本文档是对我创建的一个名为 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 级别的最大数量。LedHeight
和 LedWidth
控制着每个单独 LED 的尺寸。这些属性相对于控件的 Orientation
。四个 Margin
属性控制着 LED 和控件四个边缘之间的间距。它们也相对于控件的 Orientation
。LeftRightSeperation
和 UpDownSeperation
控制着每个 LED 之间的间距。这些属性也相对于控件的 Orientation
。
DisplayOrientation
有四种可能性:Horizontal
、HorizontalReverse
、Vertical
和 VerticalReverse
。Horizontal
从左到右绘制 LED,从小到大。HorizontalReverse
与此相反。Vertical
从上到下绘制 LED,从小到大。VerticalReverse
与此相反。文章顶部显示的布局是 Horizontal
。模拟声卡仪表最常见的布局是 VerticalReverse
。
AudioDisplayMode
有两种可能性:Stereo
和 Mono
。Stereo
为左声道和右声道采样不同的电平。Mono
为左声道和右声道采样相同的电平。
MeterMode
有三种可能的值:AudioSignal
、RandomLevels
和 SpecificLevels
。AudioSignal
告诉仪表以标准模式运行,从音频缓冲区捕获电平。RandomLevels
告诉仪表报告随机生成的电平。SpecificLevels
告诉仪表持续报告相同的电平。
SampleFrequencyMilliseconds
控制控件采样信号电平的频率,单位是毫秒,即千分之一秒。默认值,也是可能最好的值,是 100。不过,请随意根据自己的喜好进行试验。
AutoStart
告诉控件是否在应用程序加载时启动。默认情况下,此设置为 false
。我这边还需要做一些调整,下一版本会修复。
ClearMeterOnStop
告诉控件停止时是否将仪表重置为零。
以下是您可以访问的只读属性。
MeterRunning
TotalLedCount
LeftLevel
RightLevel
MeterRunning
简单地告诉您仪表是否正在运行。TotalLedCount
返回 LED 的总最大数量。LeftLevel
和 RightLevel
允许您读取上次采样的音量。
AnalogSignalMeter 公共方法
有四种方法可供您使用
StartMeter()
StartRandomMeter()
StartSpecificMeter(int leftLevel, int rightLevel)
StopMeter()
StartMeter
将启动仪表并开始从声卡采样信号。StartRandomMeter
将启动仪表,并开始为其提供随机电平。StartSpecificMeter
将启动仪表,并反复为其提供恒定的静态电平。StopMeter
将停止仪表,如果 ClearMeterOnStop
为 true
,则电平将重置为零。
您可能永远不需要最后两种启动方法,但当您开始注意到仪表行为异常时,它们对于故障排除很有用。
AnalogSignalMeter 事件
控件会触发三个事件
ReportLevel
LeftSignalPeak
RightSignalPeak
ReportLevel
在每次获取新样本时触发。它有自己的 EventArgs
,其中包含两个电平,args.LeftLevel
和 args.RightLevel
。
LeftSignalPeak
和 RightSignalPeak
在采样电平等于 LED 总数时触发。这很有用,因为这意味着音频信号可能失真,质量会下降,并且应该降低输入信号的增益。此事件有自己的 EventArgs
,其中包含峰值通道 args.Channel
以及一条消息 args.Message
。
AnalogSignalMeter 技巧
如上所述,AutoStart
需要调整。如果您希望仪表自动启动,请在设计阶段将 AutoStart
设置为 true
,然后让您的窗体检查属性,并相应地调用 StartMeter
方法。
如果您不喜欢仪表的样式但想要其功能,还有一种替代方法,您可以在演示应用程序中查看。您可以将控件的可见性设置为 false
,并在您的 ReportLevel
处理程序中,使用这些电平来设置进度条的值。将进度条的最大值设置为 TotalLedCount
值,然后让 ReportLevel
事件处理程序将进度条的值设置为 args.LeftLevel
或 args.RightLevel
值。您可以为每个通道设置一个单独的进度条。CodeProject 上有人提供了一个漂亮的渐变式进度条。它可以用来模拟较低或较高信号电平的单独颜色值。
历史
2007年9月21日 - 发布新版本
我已上传了 BuckSoft.DirectSound 和 AnalogSignalMeterDemo 的新版本。
BuckSoft.DirectSound
- 添加了一个新的公共属性
MeterMode
,以及它的枚举值。此属性告诉仪表以音频信号模式、随机电平模式或特定电平模式运行。缺少此属性是仪表在更改演示属性时总是会重新启动到随机模式的原因。
AnalogSignalMeterDemo
- 修复了“总是重新启动到随机模式”的错误。
- 演示中的进度条更新和电平标签更新是通过不安全线程调用处理的,现已修复。
- 修复了增加 LedCounts 时导致崩溃的错误
2007年9月17日 - 添加了完整的源代码
在我最初发布时,我疏忽了没有发布该控件的完整源代码。现在它已经可用了。
2007年9月14日 - 首次发布
欢迎您提出添加或改进的建议。我刚接触 C# 和 DirectX,欢迎任何人提供见解。
免责声明
此控件可免费使用和重新分发。它仍在开发中。请自行承担风险使用。