diff --git a/MonitorControl/Display.swift b/MonitorControl/Display.swift index 7931184..40a7b42 100644 --- a/MonitorControl/Display.swift +++ b/MonitorControl/Display.swift @@ -21,6 +21,7 @@ class Display { self.name = name self.isEnabled = isEnabled self.ddc = DDC(for: identifier) + self.isMuted = self.getValue(for: .audioMuteScreenBlank) == 1 } // On some displays, the display's OSD overlaps the macOS OSD, @@ -35,22 +36,32 @@ class Display { } } - func mute() { + func mute(forceVolume: Int? = nil) { var value = 0 - if self.isMuted { - value = self.getValue(for: DDC.Command.audioSpeakerVolume) + + if self.isMuted, forceVolume == nil || forceVolume! > 0 { + value = forceVolume ?? self.getValue(for: .audioSpeakerVolume) + self.saveValue(value, for: .audioSpeakerVolume) + self.isMuted = false - } else { + } else if !self.isMuted, forceVolume == nil || forceVolume == 0 { self.isMuted = true } DispatchQueue.global(qos: .userInitiated).async { - guard self.ddc?.write(command: .audioSpeakerVolume, value: UInt16(value), errorRecoveryWaitTime: self.hideOsd ? 0 : nil) == true else { + let muteValue = self.isMuted ? 1 : 2 + guard self.ddc?.write(command: .audioMuteScreenBlank, value: UInt16(muteValue), errorRecoveryWaitTime: self.hideOsd ? 0 : nil) == true else { + self.setVolume(to: value) return } - self.hideDisplayOsd() - self.showOsd(command: .audioSpeakerVolume, value: value) + if forceVolume == nil || forceVolume == 0 { + self.hideDisplayOsd() + self.showOsd(command: .audioSpeakerVolume, value: value) + self.playVolumeChangedSound() + } + + self.saveValue(muteValue, for: .audioMuteScreenBlank) } if let slider = volumeSliderHandler?.slider { @@ -59,8 +70,11 @@ class Display { } func setVolume(to value: Int) { - if value > 0 { - self.isMuted = false + if value > 0, self.isMuted { + self.mute(forceVolume: value) + } else if value == 0 { + self.mute(forceVolume: 0) + return } DispatchQueue.global(qos: .userInitiated).async { diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index bc3049e..4f1f672 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.5.2 CFBundleVersion - 515 + 516 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index c5e87d5..ef32104 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.5.2 CFBundleVersion - 515 + 516 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly