Skip to content

Commit

Permalink
fix incorrect value of audio slider when audio output is switched (#444)
Browse files Browse the repository at this point in the history
  • Loading branch information
ckfear committed Aug 15, 2022
1 parent 14301c4 commit 5e609c2
Showing 1 changed file with 44 additions and 8 deletions.
52 changes: 44 additions & 8 deletions MTMR/Widgets/VolumeViewController.swift
Expand Up @@ -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 {
Expand All @@ -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>) {
Expand Down

0 comments on commit 5e609c2

Please sign in to comment.