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:
parent
14301c4dbd
commit
5e609c2446
@ -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>) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user