mirror of
https://github.com/Toxblh/MTMR.git
synced 2026-01-10 00:58:37 +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 {
|
class VolumeViewController: NSCustomTouchBarItem {
|
||||||
private(set) var sliderItem: CustomSlider!
|
private(set) var sliderItem: CustomSlider!
|
||||||
|
private var currentDeviceId: AudioObjectID = AudioObjectID(0)
|
||||||
|
|
||||||
init(identifier: NSTouchBarItem.Identifier, image: NSImage? = nil) {
|
init(identifier: NSTouchBarItem.Identifier, image: NSImage? = nil) {
|
||||||
super.init(identifier: identifier)
|
super.init(identifier: identifier)
|
||||||
|
|
||||||
var forPropertyAddress = AudioObjectPropertyAddress(
|
|
||||||
mSelector: kAudioHardwareServiceDeviceProperty_VirtualMainVolume,
|
|
||||||
mScope: kAudioDevicePropertyScopeOutput,
|
|
||||||
mElement: kAudioObjectPropertyElementMaster
|
|
||||||
)
|
|
||||||
|
|
||||||
AudioObjectAddPropertyListenerBlock(defaultDeviceID, &forPropertyAddress, nil, audioObjectPropertyListenerBlock)
|
|
||||||
|
|
||||||
if image == nil {
|
if image == nil {
|
||||||
sliderItem = CustomSlider()
|
sliderItem = CustomSlider()
|
||||||
} else {
|
} else {
|
||||||
@ -29,6 +22,49 @@ class VolumeViewController: NSCustomTouchBarItem {
|
|||||||
sliderItem.floatValue = getInputGain() * 100
|
sliderItem.floatValue = getInputGain() * 100
|
||||||
|
|
||||||
view = sliderItem
|
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>) {
|
func audioObjectPropertyListenerBlock(numberAddresses _: UInt32, addresses _: UnsafePointer<AudioObjectPropertyAddress>) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user