我正在尝试使用 coredll.dll 中的 waveOutSetVolume 逐渐将音量从静音(或接近静音)增加到最大值。
我发现的大多数代码示例都显示了一些预定义的关闭、低、正常、中、高和非常高的设置点,如下所示:
Public Enum Volumes As Integer
OFF = 0
LOW = 858993459
NORMAL = 1717986918
MEDIUM = -1717986919
HIGH = -858993460
VERY_HIGH = -1
End Enum
在我的尝试中,我尝试使用 1200 作为我的增量器从 0 逐渐提高音量。这只会增加右声道的音量。在大约 66000 的某个地方,所有音频都恢复为静音并再次开始增加,但仅在正确的通道上。
正如我希望或预期的那样,上面列出的常数确实会影响两个通道。但我不清楚如何从 0 逐渐过渡到 858993459,然后再从 858993459 逐渐过渡到 1717986918,等等。
我怀疑从根本上说我不了解这是如何工作的。
我在 Visual Studio 2008 中将 VB.Net 与 .Net Compact Framework 3.5 一起使用。如果您在 C# 中有解决方案,我可以接受。
编辑:
根据我现在阅读的内容,上面列出的枚举值基于十六进制,其中 00000000 是可能的最低音量,而 FFFFFFFF 是可能的最高音量。这仍然对我没有太大帮助,因为我不确定如何在 VB.Net 中逐渐增加十六进制并同时将其转换为整数。我也不清楚仅仅在这里增加十六进制是否会导致所有/两个通道的音量同时增加,或者我是否仍然遇到我遇到的立体声问题。
我正在使用这个类:
Public Class VolumeControl
<DllImport("coredll.dll", SetLastError:=True)> _
Friend Shared Function waveOutSetVolume(ByVal device As IntPtr, ByVal volume As Integer) As Integer
End Function
<DllImport("coredll.dll", SetLastError:=True)> _
Friend Shared Function waveOutGetVolume(ByVal device As IntPtr, ByRef volume As Integer) As Integer
End Function
Public Shared Property Volume() As Integer
Get
Dim v As Integer = CInt(0)
waveOutGetVolume(IntPtr.Zero, v)
Return v
End Get
Set(ByVal value As Integer)
waveOutSetVolume(IntPtr.Zero, value)
End Set
End Property
End Class
好的,这里有一些 API 文档,在这个特定的上下文中对我来说没有多大意义。什么是低位词和高位词,它们如何同时存在于一个值中?
· dwVolume
新的音量设置。低位字包含左声道音量设置,高位字包含右声道设置。0xFFFF 值表示全音量,0x0000 值表示静音。如果设备不支持左右音量控制,则 dwVolume 的低位字指定音量,高位字被忽略。