我正在尝试使用coredll.dll中的waveOutSetVolume逐渐增加音频音量,从静音(或接近静音)到最大。
我找到的大多数代码示例都显示了一些预定义的关闭、低、正常、中、高和非常高的设置点,如下所示:
Public Enum Volumes As Integer
OFF = 0
LOW = 858993459
NORMAL = 1717986918
MEDIUM = -1717986919
HIGH = -858993460
VERY_HIGH = -1
End Enum
在我的尝试中,我尝试从0开始使用1200作为增量逐步提高音量。这只会增加右声道的音量。大约在66000左右,所有音频都会回到静音状态,然后再次开始增加,但只在右声道上。
上面列出的常数确实影响了我所希望或期望的两个通道。但是,我不清楚如何逐渐从0过渡到858993459,然后再次逐渐从858993459过渡到1717986918等。
我怀疑我的理解中有一些根本性的问题。
我正在使用VB.Net和Visual Studio 2008中的.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的低位字指定音量级别,忽略高位字。
waveOutSetVolume(ByVal device As IntPtr, ByVal volume As UInt32) As Integer
- HK1