autohotkey-steelseries-keyb.../Steelseries-Sonar-KB-Audio-Control.ahk
ZenDeuo 4046fce47d Update Steelseries-Sonar-KB-Audio-Control.ahk
Signed-off-by: ZenDeuo <ryan@deuo.one>
2025-07-07 07:13:22 +01:00

122 lines
3.2 KiB
AutoHotkey

#SingleInstance Force
#Persistent
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
if not A_IsAdmin
{
Run *RunAs "%A_ScriptFullPath%" ; Requires v1.0.92.01+
ExitApp
}
; Define constants
DEVICE_NAME := "SteelSeries Sonar - Media"
VOLUME_STEP := 1311
; Create GUI for OSD
Gui, +AlwaysOnTop +ToolWindow -Caption +LastFound
Gui, Color, 000000
Gui, Font, s20 cFFFFFF, Segoe UI
Gui, Add, Text, vVolumeText w180 x10, Volume: --`% ; Reduced width to 180, left-aligned with 10px margin
WinSet, Transparent, 200
Gui, +E0x20 ; Click through
; Global variables to track volume
global currentVolume := 0
global isMuted := 0
; Function to show volume OSD
ShowVolumeOSD() {
; Update OSD text
if (isMuted) {
GuiControl,, VolumeText, Volume: Muted
} else {
GuiControl,, VolumeText, Volume: %currentVolume%`%
}
; Position the OSD in the center of the screen
SysGet, MonitorWorkArea, MonitorWorkArea
OSDWidth := 300
OSDHeight := 60
xPos := MonitorWorkAreaRight - OSDWidth / 2
yPos := MonitorWorkAreaBottom - OSDHeight / 2
; Show the OSD
Gui, Show, NoActivate w%OSDWidth% h%OSDHeight% x%xPos% y%yPos%
; Auto-hide after 1.5 seconds
SetTimer, HideOSD, -1500
}
; Auto-hide function
HideOSD:
Gui, Hide
return
; Initialize volume (try to get initial value)
InitializeVolume:
tempFile := A_Temp . "\volume_init.txt"
RunWait, %comspec% /c C:\Nircmd\nircmd.exe setsysvolume 0 "%DEVICE_NAME%" > "%tempFile%" 2>&1,, Hide
FileRead, volumeOutput, %tempFile%
RegExMatch(volumeOutput, "Before change.* (\d+)", volumeMatch)
volume := volumeMatch1
if (volume != "") {
currentVolume := Round((volume / 65535) * 100)
}
FileDelete, %tempFile%
; Check mute state
tempFile := A_Temp . "\mute_init.txt"
RunWait, %comspec% /c C:\Nircmd\nircmd.exe mutesysvolume 3 "%DEVICE_NAME%" > "%tempFile%" 2>&1,, Hide
FileRead, muteOutput, %tempFile%
isMuted := InStr(muteOutput, "muted")
FileDelete, %tempFile%
return
; Run initialization on startup
GoSub, InitializeVolume
Volume_Up::
; Calculate new volume
newVolume := currentVolume + 2 ; Approximately 2% per step
if (newVolume > 100)
newVolume := 100
; Update our tracker
currentVolume := newVolume
isMuted := 0
; Execute volume change
Run, C:\Nircmd\nircmd.exe changesysvolume %VOLUME_STEP% "%DEVICE_NAME%",, Hide
; Show the OSD
ShowVolumeOSD()
Return
Volume_Down::
; Calculate new volume
newVolume := currentVolume - 2 ; Approximately 2% per step
if (newVolume < 0)
newVolume := 0
; Update our tracker
currentVolume := newVolume
; Execute volume change
Run, C:\Nircmd\nircmd.exe changesysvolume -%VOLUME_STEP% "%DEVICE_NAME%",, Hide
; Show the OSD
ShowVolumeOSD()
Return
Volume_Mute::
; Toggle mute state
isMuted := !isMuted
; Execute mute toggle
Run, C:\Nircmd\nircmd.exe mutesysvolume 2 "%DEVICE_NAME%",, Hide
; Show the OSD
ShowVolumeOSD()
Return