diff --git a/MTMR/VolumeViewController.swift b/MTMR/VolumeViewController.swift index 73517f1..b73aeb7 100644 --- a/MTMR/VolumeViewController.swift +++ b/MTMR/VolumeViewController.swift @@ -16,6 +16,39 @@ class VolumeViewController: NSCustomTouchBarItem { } self.view = sliderItem + + var forPropertyAddress = AudioObjectPropertyAddress( + mSelector: kAudioHardwareServiceDeviceProperty_VirtualMasterVolume, + mScope: kAudioDevicePropertyScopeOutput, + mElement: kAudioObjectPropertyElementMaster) + + addListenerBlock(listenerBlock: audioObjectPropertyListenerBlock, + onAudioObjectID: defaultDeviceID, + forPropertyAddress: &forPropertyAddress) + } + + func addListenerBlock( listenerBlock: @escaping AudioObjectPropertyListenerBlock, onAudioObjectID: AudioObjectID, forPropertyAddress: UnsafePointer) { + + if (kAudioHardwareNoError != AudioObjectAddPropertyListenerBlock(onAudioObjectID, forPropertyAddress, nil, listenerBlock)) { + print("Error calling: AudioObjectAddPropertyListenerBlock") } + } + + func audioObjectPropertyListenerBlock (numberAddresses: UInt32, addresses: UnsafePointer) { + var index: UInt32 = 0 + while index < numberAddresses { + let address: AudioObjectPropertyAddress = addresses[Int(index)] + switch address.mSelector { + case kAudioHardwareServiceDeviceProperty_VirtualMasterVolume: + DispatchQueue.main.async { + self.sliderItem.floatValue = self.getInputGain() * 100 + } + default: + + print("We didn't expect this!") + + } + index += 1 + } } required init?(coder: NSCoder) { @@ -24,7 +57,7 @@ class VolumeViewController: NSCustomTouchBarItem { @objc func sliderValueChanged(_ sender: Any) { if let sliderItem = sender as? NSSlider { - setInputGain(Float32(sliderItem.intValue)/100.0) + _ = setInputGain(Float32(sliderItem.intValue)/100.0) } } @@ -52,13 +85,30 @@ class VolumeViewController: NSCustomTouchBarItem { private func setInputGain(_ volume: Float32) -> OSStatus { var inputVolume: Float32 = volume + + if inputVolume == 0.0 { + _ = setMute( mute: 1) + } else { + _ = setMute( mute: 0) + } + let size: UInt32 = UInt32(MemoryLayout.size(ofValue: inputVolume)) var address: AudioObjectPropertyAddress = AudioObjectPropertyAddress() - address.mSelector = AudioObjectPropertySelector(kAudioHardwareServiceDeviceProperty_VirtualMasterVolume) address.mScope = AudioObjectPropertyScope(kAudioDevicePropertyScopeOutput) address.mElement = AudioObjectPropertyElement(kAudioObjectPropertyElementMaster) + address.mSelector = AudioObjectPropertySelector(kAudioHardwareServiceDeviceProperty_VirtualMasterVolume) return AudioObjectSetPropertyData(defaultDeviceID, &address, 0, nil, size, &inputVolume) } + + private func setMute( mute: Int) -> OSStatus { + var muteVal: Int = mute + var address: AudioObjectPropertyAddress = AudioObjectPropertyAddress() + address.mSelector = AudioObjectPropertySelector(kAudioDevicePropertyMute) + let size: UInt32 = UInt32(MemoryLayout.size(ofValue: muteVal)) + address.mScope = AudioObjectPropertyScope(kAudioDevicePropertyScopeOutput) + address.mElement = AudioObjectPropertyElement(kAudioObjectPropertyElementMaster) + return AudioObjectSetPropertyData(defaultDeviceID, &address, 0, nil, size, &muteVal) + } } class CustomSliderCell: NSSliderCell {