Skip to content

Commit 8868cb6

Browse files
Working apps audio control
1 parent 236235e commit 8868cb6

File tree

4 files changed

+59
-42
lines changed

4 files changed

+59
-42
lines changed

VBAudioRouter.UWP/Controls/AudioSessionControl.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
Background="{ThemeResource NodeBackgroundColor}">
1313

1414
<StackPanel Orientation="Vertical">
15+
<TextBlock x:Name="DisplayNameTextBlock" Margin="5,15,10,0" />
1516
<Grid>
1617
<Grid.ColumnDefinitions>
1718
<ColumnDefinition Width="auto" />

VBAudioRouter.UWP/Controls/AudioSessionControl.xaml.vb

Lines changed: 42 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,65 @@
1-
2-
Imports System.Runtime.InteropServices
3-
Imports NAudio.CoreAudioApi.Interfaces
4-
Imports VBAudioRouter.Interop
1+
Imports NAudio.CoreAudioApi.Interfaces
52

63
Namespace Controls
74

85
Public NotInheritable Class AudioSessionControl
96
Inherits UserControl
10-
Implements IAudioEndpointVolumeCallback, IAudioSessionEvents
7+
Implements IAudioSessionEvents
118

12-
Public ReadOnly Property VolumeManager As IAudioEndpointVolume
13-
Public ReadOnly Property MeterInformation As IAudioMeterInformation
149
Public ReadOnly Property AudioSession As IAudioSessionControl
10+
Public ReadOnly Property AudioSessionControl As NAudio.CoreAudioApi.AudioSessionControl
11+
Public ReadOnly Property AudioMeterInformation As NAudio.CoreAudioApi.AudioMeterInformation
12+
Public ReadOnly Property SimpleAudioVolume As NAudio.CoreAudioApi.SimpleAudioVolume
1513

1614
Public ReadOnly SpeakerControlPageInstance As SpeakerControlPage
1715

1816
Friend Sub New(parent As SpeakerControlPage, audioSession As IAudioSessionControl)
1917
InitializeComponent()
2018

2119
Me.SpeakerControlPageInstance = parent
22-
Me.AudioSession = audioSession
20+
Me.AudioSessionControl = New NAudio.CoreAudioApi.AudioSessionControl(audioSession)
21+
AudioMeterInformation = AudioSessionControl.AudioMeterInformation
22+
SimpleAudioVolume = AudioSessionControl.SimpleAudioVolume
2323

24-
VolumeManager = DirectCast(audioSession, IAudioEndpointVolume)
25-
MeterInformation = DirectCast(audioSession, IAudioMeterInformation)
26-
27-
VolumeManager.RegisterControlChangeNotify(Me)
28-
OnNotify(IntPtr.Zero)
24+
VolumeSlider.Value = SimpleAudioVolume.Volume * 100
25+
DisplayNameTextBlock.Text = AudioSessionControl.DisplayName
2926

3027
Dim timer As New Timers.Timer()
3128
timer.Interval = 30
3229
AddHandler timer.Elapsed, Sub()
33-
Dim unused = Dispatcher.RunIdleAsync(Sub()
34-
Dim meters As Single() = New Single(MeterInformation.GetMeteringChannelCount() - 1) {}
35-
Dim metersRef = GCHandle.Alloc(meters, GCHandleType.Pinned)
36-
MeterInformation.GetChannelsPeakValues(meters.Length, metersRef.AddrOfPinnedObject)
37-
metersRef.Free()
38-
LeftMeter.ScaleY = meters(0)
39-
RightMeter.ScaleY = meters(1)
40-
End Sub)
30+
Dim unused = Dispatcher?.RunIdleAsync(Sub()
31+
Dim peakValues = AudioMeterInformation.PeakValues
32+
If peakValues.Count > 0 Then
33+
LeftMeter.ScaleX = peakValues(0)
34+
End If
35+
If peakValues.Count > 1 Then
36+
RightMeter.ScaleX = peakValues(1)
37+
End If
38+
End Sub)
4139
End Sub
4240
timer.Enabled = True
4341

4442
audioSession.RegisterAudioSessionNotification(Me)
4543
End Sub
4644

4745
Private Sub AudioSessionControl_Unloaded(sender As Object, e As RoutedEventArgs) Handles Me.Unloaded
48-
VolumeManager?.UnregisterControlChangeNotify(Me)
4946
AudioSession?.UnregisterAudioSessionNotification(Me)
5047
End Sub
5148

5249
Dim oldValue As Double = -1
5350
Private Sub VolumeSlider_ValueChanged(sender As Object, e As RangeBaseValueChangedEventArgs)
54-
If VolumeManager Is Nothing Or oldValue = VolumeSlider.Value Then Exit Sub
51+
If SimpleAudioVolume Is Nothing Or oldValue = VolumeSlider.Value Then Exit Sub
5552
oldValue = VolumeSlider.Value
56-
VolumeManager.SetMasterVolumeLevelScalar(Convert.ToSingle(VolumeSlider.Value / 100), Guid.Empty)
53+
SimpleAudioVolume.Volume = CType(VolumeSlider.Value / 100.0F, Single)
5754
End Sub
5855

5956
Dim isMuted As Boolean = False
6057
Private Sub MuteButton_Click(sender As Object, e As RoutedEventArgs)
61-
If VolumeManager Is Nothing Then Exit Sub
58+
If SimpleAudioVolume Is Nothing Then Exit Sub
6259

6360
If sender IsNot Nothing Then
6461
isMuted = Not isMuted
65-
VolumeManager.SetMute(isMuted, Guid.Empty)
62+
SimpleAudioVolume.Mute = isMuted
6663
End If
6764

6865
If isMuted Then
@@ -72,40 +69,45 @@ Namespace Controls
7269
End If
7370
End Sub
7471

75-
Public Sub OnNotify(notifyData As IntPtr) Implements IAudioEndpointVolumeCallback.OnNotify
76-
Dim unused = Dispatcher.RunIdleAsync(Sub()
77-
VolumeSlider.Value = VolumeManager.GetMasterVolumeLevelScalar() * 100
78-
isMuted = VolumeManager.GetMute()
79-
MuteButton_Click(Nothing, Nothing)
80-
End Sub)
81-
End Sub
82-
8372
Public Function OnDisplayNameChanged(displayName As String, ByRef eventContext As Guid) As Integer Implements IAudioSessionEvents.OnDisplayNameChanged
73+
DisplayNameTextBlock.Text = AudioSessionControl.DisplayName
8474

75+
Return 0
8576
End Function
8677

8778
Public Function OnIconPathChanged(iconPath As String, ByRef eventContext As Guid) As Integer Implements IAudioSessionEvents.OnIconPathChanged
88-
79+
Return 0
8980
End Function
9081

9182
Public Function OnSimpleVolumeChanged(volume As Single, isMuted As Boolean, ByRef eventContext As Guid) As Integer Implements IAudioSessionEvents.OnSimpleVolumeChanged
92-
83+
Dispatcher.RunIdleAsync(Sub()
84+
If Not oldValue = volume * 100 Then
85+
oldValue = volume * 100
86+
VolumeSlider.Value = volume * 100
87+
End If
88+
Me.isMuted = isMuted
89+
MuteButton_Click(Nothing, Nothing)
90+
End Sub)
91+
92+
Return 0
9393
End Function
9494

9595
Public Function OnChannelVolumeChanged(channelCount As UInteger, newVolumes As IntPtr, channelIndex As UInteger, ByRef eventContext As Guid) As Integer Implements IAudioSessionEvents.OnChannelVolumeChanged
96-
96+
Return 0
9797
End Function
9898

9999
Public Function OnGroupingParamChanged(ByRef groupingId As Guid, ByRef eventContext As Guid) As Integer Implements IAudioSessionEvents.OnGroupingParamChanged
100-
100+
Return 0
101101
End Function
102102

103103
Public Function OnStateChanged(state As AudioSessionState) As Integer Implements IAudioSessionEvents.OnStateChanged
104-
104+
Return 0
105105
End Function
106106

107107
Public Function OnSessionDisconnected(disconnectReason As AudioSessionDisconnectReason) As Integer Implements IAudioSessionEvents.OnSessionDisconnected
108-
SpeakerControlPageInstance.AudioSessions.Remove(Me)
108+
Dispatcher.RunIdleAsync(Sub() SpeakerControlPageInstance.AudioSessions.Remove(Me))
109+
110+
Return 0
109111
End Function
110112
End Class
111113

VBAudioRouter.UWP/SpeakerControlPage.xaml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@
1010
RequestedTheme="Dark">
1111

1212
<Grid>
13-
<StackPanel Padding="10" Orientation="Horizontal">
13+
<Grid.ColumnDefinitions>
14+
<ColumnDefinition Width="auto" />
15+
<ColumnDefinition Width="*" />
16+
</Grid.ColumnDefinitions>
17+
<StackPanel Grid.Column="0" Padding="10" Orientation="Horizontal">
1418
<Grid>
1519
<Grid.RowDefinitions>
1620
<RowDefinition Height="auto" />
@@ -39,6 +43,12 @@
3943
</Grid>
4044
</StackPanel>
4145
</StackPanel>
42-
<ListView ItemsSource="{x:Bind AudioSessions}" />
46+
<ListView Grid.Column="1" ItemsSource="{x:Bind AudioSessions}" SelectionMode="None">
47+
<ListView.ItemContainerStyle>
48+
<Style TargetType="ListViewItem">
49+
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
50+
</Style>
51+
</ListView.ItemContainerStyle>
52+
</ListView>
4353
</Grid>
4454
</Page>

VBAudioRouter.UWP/SpeakerControlPage.xaml.vb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
Imports System.Runtime.InteropServices
22
Imports NAudio.CoreAudioApi.Interfaces
33
Imports VBAudioRouter.Interop
4+
Imports WinUI.Interop
45
Imports WinUI.Interop.AppContainer
56

67
Public NotInheritable Class SpeakerControlPage
@@ -33,6 +34,9 @@ Public NotInheritable Class SpeakerControlPage
3334
End Sub
3435
timer.Enabled = True
3536

37+
' UWP apps don't have permission to do the following stuff 😥
38+
If InteropHelper.IsUWP() Then Exit Sub
39+
3640
_AudioSessionManager = DirectCast(Await AudioInterfaceActivator.ActivateAudioInterfaceAsync(Of IAudioSessionManager)(deviceId), IAudioSessionManager2)
3741
AudioSessionManager.RegisterSessionNotification(Me)
3842
Dim sessionEnumerator = AudioSessionManager.GetSessionEnumerator()

0 commit comments

Comments
 (0)