-
Notifications
You must be signed in to change notification settings - Fork 0
/
AudioAPI.vb
165 lines (145 loc) · 6.73 KB
/
AudioAPI.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
Option Explicit On
Option Strict On
Imports System.ComponentModel
Imports CoreAudioApi
<Browsable(True), Description("Inherits simple functions provided by CoreAudioAPI.dll")>
Public NotInheritable Class SampleAudioAPI
Friend deviceCapture As MMDevice
Friend deviceRender As MMDevice
Friend devEnum As MMDeviceEnumerator
Public Sub New()
If Environment.OSVersion.Version.Major >= 6 Then
devEnum = New MMDeviceEnumerator
deviceCapture = devEnum.GetDefaultAudioEndpoint(EDataFlow.eCapture, ERole.eMultimedia)
deviceRender = devEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia)
Else
Throw New InvalidEnumArgumentException("Minimum Windows Vista requiered.")
End If
End Sub
<Browsable(True), Description("Audio Channels.")>
Public Enum Channels As Integer
IN_LeftPeak = 1
IN_RightPeak = 2
IN_Master = 3
OUT_LeftPeak = 4
OUT_RightPeak = 5
OUT_Master = 6
End Enum
<Browsable(True), Description("Returns the value of the associated audio channel.")>
Public Shadows Function Value(ByVal channel As Channels, Optional ByVal smooth As Boolean = False) As Single
Dim in_state As Integer = CInt(deviceCapture.State)
Dim out_state As Integer = CInt(deviceRender.State)
Select Case channel
'MICROPHONE
Case Channels.IN_Master
If in_state = 1 AndAlso Not deviceCapture.AudioMeterInformation.PeakValues.Count = 0 Then
Dim peak As Single = deviceCapture.AudioMeterInformation.MasterPeakValue
Smooth_IN_MASTER.Input = SingleToIntPercentage(peak)
Return If(smooth = True, IntToSinglePercentage(Smooth_IN_MASTER.SmoothedValue), peak)
End If
Case Channels.IN_LeftPeak
If in_state = 1 AndAlso deviceCapture.AudioMeterInformation.PeakValues.Count >= 1 Then
Dim peak As Single = deviceCapture.AudioMeterInformation.PeakValues(0)
Smooth_IN_LEFT.Input = SingleToIntPercentage(peak)
Return If(smooth = True, IntToSinglePercentage(Smooth_IN_LEFT.SmoothedValue), peak)
End If
Case Channels.IN_RightPeak
If in_state = 1 AndAlso deviceCapture.AudioMeterInformation.PeakValues.Count >= 2 Then
Dim peak As Single = deviceCapture.AudioMeterInformation.PeakValues(1)
Smooth_IN_RIGHT.Input = SingleToIntPercentage(peak)
Return If(smooth = True, IntToSinglePercentage(Smooth_IN_RIGHT.SmoothedValue), peak)
End If
'SPEAKERS
Case Channels.OUT_Master
If out_state = 1 AndAlso Not deviceRender.AudioMeterInformation.PeakValues.Count = 0 Then
Dim peak As Single = deviceRender.AudioMeterInformation.MasterPeakValue
Smooth_OUT_MASTER.Input = SingleToIntPercentage(peak)
Return If(smooth = True, IntToSinglePercentage(Smooth_OUT_MASTER.SmoothedValue), peak)
End If
Case Channels.OUT_LeftPeak
If out_state = 1 AndAlso deviceRender.AudioMeterInformation.PeakValues.Count >= 1 Then
Dim peak As Single = deviceRender.AudioMeterInformation.PeakValues(0)
Smooth_OUT_LEFT.Input = SingleToIntPercentage(peak)
Return If(smooth = True, IntToSinglePercentage(Smooth_OUT_LEFT.SmoothedValue), peak)
End If
Case Channels.OUT_RightPeak
If out_state = 1 AndAlso deviceRender.AudioMeterInformation.PeakValues.Count >= 2 Then
Dim peak As Single = deviceRender.AudioMeterInformation.PeakValues(1)
Smooth_OUT_RIGHT.Input = SingleToIntPercentage(peak)
Return If(smooth = True, IntToSinglePercentage(Smooth_OUT_RIGHT.SmoothedValue), peak)
End If
End Select
'ON ERROR RETURN 0
Return 0!
End Function
Private Smooth_IN_MASTER As New AudioSmoother
Private Smooth_IN_LEFT As New AudioSmoother
Private Smooth_IN_RIGHT As New AudioSmoother
Private Smooth_OUT_MASTER As New AudioSmoother
Private Smooth_OUT_LEFT As New AudioSmoother
Private Smooth_OUT_RIGHT As New AudioSmoother
Public Property IN_MasterScalar As Single
Get
Return deviceCapture.AudioEndpointVolume.MasterVolumeLevelScalar
End Get
Set(ByVal value As Single)
deviceCapture.AudioEndpointVolume.MasterVolumeLevelScalar = value
End Set
End Property
Public Property OUT_MasterScalar As Single
Get
Return deviceRender.AudioEndpointVolume.MasterVolumeLevelScalar
End Get
Set(ByVal value As Single)
deviceRender.AudioEndpointVolume.MasterVolumeLevelScalar = value
End Set
End Property
Public Property IN_MUTE As Boolean
Get
Return deviceCapture.AudioEndpointVolume.Mute
End Get
Set(ByVal value As Boolean)
deviceCapture.AudioEndpointVolume.Mute = value
End Set
End Property
Public Property OUT_MUTE As Boolean
Get
Return deviceRender.AudioEndpointVolume.Mute
End Get
Set(ByVal value As Boolean)
deviceRender.AudioEndpointVolume.Mute = value
End Set
End Property
Public Shared Function SingleToIntPercentage(ByVal value As Single) As Integer
'SINGLE PERCENTAGE = 0.01 TO 1.00
Dim IntegerPercentage As UInteger = CUInt(Math.Min(1.0!, value) * 100)
Return CInt(IntegerPercentage)
End Function
Public Shared Function IntToSinglePercentage(ByVal value As Integer) As Single
'INTEGER PERCENTAGE = 1 TO 100
Dim SinglePercentage As Single = CSng(Math.Min(100, value) / 100)
Return SinglePercentage
End Function
Private NotInheritable Class AudioSmoother
Public WriteOnly Property Input As Integer
Set(value As Integer)
Me.Value = value
End Set
End Property
Private Shadows Value As Integer
Protected SmoothValue As Integer
Private Const Decrement As Integer = 2
Public ReadOnly Property SmoothedValue As Integer
Get
Return Fader()
End Get
End Property
Private Function Fader() As Integer
If Value = 0 Then Return 0
'create an average of last/current value
Dim average As Integer = Math.Min((Value + SmoothValue) \ 2, 100)
SmoothValue = Math.Max(Math.Max(average, SmoothValue - Decrement), 0)
Return SmoothValue
End Function
End Class
End Class