-
Notifications
You must be signed in to change notification settings - Fork 0
/
FixMic.ps1
108 lines (93 loc) · 4.54 KB
/
FixMic.ps1
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
# Because I was too lazy to switch microphone in Microsoft Teams every time I switched from headset to external mic to speaker mic,
# I wrote this script to do it for me. Depends on https://github.com/frgnca/AudioDeviceCmdlets
# Please note that I rarely code in Powershell. It's probably not pretty code, but it gets the job done.
# Requires local admin, because it needs to tweak the audio devices in registry.
# Source: https://den.dev/blog/powershell-windows-notification/
function Show-Notification {
[cmdletbinding()]
Param (
[string]
$ToastTitle,
[string]
$ToastText
)
[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null
$Template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02)
$RawXml = [xml] $Template.GetXml()
($RawXml.toast.visual.binding.text|where {$_.id -eq "1"}).AppendChild($RawXml.CreateTextNode($ToastTitle)) > $null
($RawXml.toast.visual.binding.text|where {$_.id -eq "2"}).AppendChild($RawXml.CreateTextNode($ToastText)) > $null
$SerializedXml = New-Object Windows.Data.Xml.Dom.XmlDocument
$SerializedXml.LoadXml($RawXml.OuterXml)
$Toast = [Windows.UI.Notifications.ToastNotification]::new($SerializedXml)
$Toast.Tag = "PowerShell"
$Toast.Group = "PowerShell"
$Toast.ExpirationTime = [DateTimeOffset]::Now.AddMinutes(1)
$Notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("PowerShell")
$Notifier.Show($Toast);
}
$NotificationText = ""
# For some reason, the name of my headset has a number in front of it that increases every
# now and then, and sometimes isn't even there, so I'm using regex matching instead of string compare.
# Priority of microphones. The higher in the list, the more priority the microphone has.
$MicrophonePriorityList = "Digital Audio Interface \(Valve VR Radio \& HMD Mic\)",
"Microphone \(Yeti Stereo Microphone\)",
"Microphone \((\d)*(- )?(Logitech )?G935(\/G933s)? Gaming Headset\)",
"Microphone Array \((\d)*(- )?Realtek\(R\) Audio\)"
# Priority of speakers. The higher in the list, the more priority the speaker has.
$SpeakersPriorityList = "Index HMD \(NVIDIA High Definition Audio\)",
"Speakers \((\d)*(- )?(Logitech )?G935(\/G933s)? Gaming Headset\)",
"Speakers(\/HP)? \((\d)*(- )?Realtek\(R\) Audio\)"
$CorrectMicrophoneID = ""
:micloop foreach ($mic in $MicrophonePriorityList) {
if ($CorrectMicrophoneID -eq "") {
#Write-Output "Checking if the following mic is plugged in: " $mic
#Write-Output "cmi = " $CurrentMicrophoneIndex
foreach ($ad in Get-AudioDevice -List) {
if ($ad.Name -match $mic -and $ad.Type.Equals("Recording")) {
#We already have the best mic, so exit
if ($ad.Default){
$message += "Best mic is already default: " + $ad.Name + "`n"
Write-Output $message
$NotificationText += $message
break micloop
} else {
$CorrectMicrophoneID = $ad.ID
break
}
}
}
}
}
if ($CorrectMicrophoneID -ne "") {
$message += "Switching to better microphone: " + $ad.Name
Write-Output $message
$NotificationText += $message
Set-AudioDevice -ID $CorrectMicrophoneID >$null 2>&1
}
#Yeah, repeat code. I don't really care
$CorrectSpeakersID = ""
:speakloop foreach ($speak in $SpeakersPriorityList) {
if ($CorrectSpeakersID -eq "") {
foreach ($ad in Get-AudioDevice -List) {
if ($ad.Name -match $speak -and $ad.Type.Equals("Playback")) {
#We already have the best speaker, so exit
if ($ad.Default){
$message = "Best speaker is already default: " + $ad.Name
Write-Output $message
$NotificationText += $message
break speakloop
} else {
$CorrectSpeakersID = $ad.ID
break
}
}
}
}
}
if ($CorrectSpeakersID -ne "") {
$message = "Switching to better speaker: " + $ad.Name
Write-Output $message
$NotificationText += $message
Set-AudioDevice -ID $CorrectSpeakersID >$null 2>&1
}
Show-Notification -ToastTitle "AudioFix" -ToastText $NotificationText