1
0
mirror of https://github.com/Toxblh/MTMR.git synced 2026-01-09 16:48:38 +00:00

fix incorrect value of audio slider when audio output is switched (#444)

This commit is contained in:
ckfear 2022-08-16 05:47:24 +08:00 committed by GitHub
parent 14301c4dbd
commit 5e609c2446
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -5,18 +5,11 @@ import CoreAudio
class VolumeViewController: NSCustomTouchBarItem {
private(set) var sliderItem: CustomSlider!
private var currentDeviceId: AudioObjectID = AudioObjectID(0)
init(identifier: NSTouchBarItem.Identifier, image: NSImage? = nil) {
super.init(identifier: identifier)
var forPropertyAddress = AudioObjectPropertyAddress(
mSelector: kAudioHardwareServiceDeviceProperty_VirtualMainVolume,
mScope: kAudioDevicePropertyScopeOutput,
mElement: kAudioObjectPropertyElementMaster
)
AudioObjectAddPropertyListenerBlock(defaultDeviceID, &forPropertyAddress, nil, audioObjectPropertyListenerBlock)
if image == nil {
sliderItem = CustomSlider()
} else {
@ -29,6 +22,49 @@ class VolumeViewController: NSCustomTouchBarItem {
sliderItem.floatValue = getInputGain() * 100
view = sliderItem
currentDeviceId = defaultDeviceID
self.addAudioRouteChangedListener()
self.addCurrentAudioVolumeChangedListener()
}
private func addAudioRouteChangedListener() {
let audioId = AudioObjectID(bitPattern: kAudioObjectSystemObject)
var forPropertyAddress = AudioObjectPropertyAddress(
mSelector: kAudioHardwarePropertyDefaultOutputDevice,
mScope: kAudioObjectPropertyScopeGlobal,
mElement: kAudioObjectPropertyElementMaster)
AudioObjectAddPropertyListenerBlock(audioId, &forPropertyAddress, nil, audioRouteChanged)
}
func audioRouteChanged(numberAddresses _: UInt32, addresses _: UnsafePointer<AudioObjectPropertyAddress>) {
self.removeLastAudioVolumeChangeListener()
currentDeviceId = defaultDeviceID
self.addCurrentAudioVolumeChangedListener()
DispatchQueue.main.async {
self.sliderItem.floatValue = self.getInputGain() * 100
}
}
private func addCurrentAudioVolumeChangedListener() {
var forPropertyAddress = AudioObjectPropertyAddress(
mSelector: kAudioHardwareServiceDeviceProperty_VirtualMainVolume,
mScope: kAudioDevicePropertyScopeOutput,
mElement: kAudioObjectPropertyElementMaster
)
AudioObjectAddPropertyListenerBlock(defaultDeviceID, &forPropertyAddress, nil, audioObjectPropertyListenerBlock)
}
private func removeLastAudioVolumeChangeListener() {
var forPropertyAddress = AudioObjectPropertyAddress(
mSelector: kAudioHardwareServiceDeviceProperty_VirtualMainVolume,
mScope: kAudioDevicePropertyScopeOutput,
mElement: kAudioObjectPropertyElementMaster
)
AudioObjectRemovePropertyListenerBlock(currentDeviceId, &forPropertyAddress, nil, audioObjectPropertyListenerBlock)
}
func audioObjectPropertyListenerBlock(numberAddresses _: UInt32, addresses _: UnsafePointer<AudioObjectPropertyAddress>) {