From 621cb3242b44ee843aa4795adc7ec29a89293603 Mon Sep 17 00:00:00 2001 From: ad Date: Fri, 13 Apr 2018 21:27:59 +0300 Subject: [PATCH 1/2] + listener for changes of sytem volume known bug: sound not mutes at value 0.0 --- MTMR/VolumeViewController.swift | 43 ++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/MTMR/VolumeViewController.swift b/MTMR/VolumeViewController.swift index 73517f1..ee13dad 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) } } @@ -51,10 +84,14 @@ class VolumeViewController: NSCustomTouchBarItem { } private func setInputGain(_ volume: Float32) -> OSStatus { - var inputVolume: Float32 = volume + var inputVolume: Float32 = volume //0.0 //roundf(volume * 100) / 100 let size: UInt32 = UInt32(MemoryLayout.size(ofValue: inputVolume)) var address: AudioObjectPropertyAddress = AudioObjectPropertyAddress() - address.mSelector = AudioObjectPropertySelector(kAudioHardwareServiceDeviceProperty_VirtualMasterVolume) + if inputVolume == 0.0 { + address.mSelector = AudioObjectPropertySelector(kAudioDevicePropertyMute) + } else { + address.mSelector = AudioObjectPropertySelector(kAudioHardwareServiceDeviceProperty_VirtualMasterVolume) + } address.mScope = AudioObjectPropertyScope(kAudioDevicePropertyScopeOutput) address.mElement = AudioObjectPropertyElement(kAudioObjectPropertyElementMaster) return AudioObjectSetPropertyData(defaultDeviceID, &address, 0, nil, size, &inputVolume) From 849b5b6db0c61bef902e87c32c448c9fbcfc45a3 Mon Sep 17 00:00:00 2001 From: ad Date: Fri, 13 Apr 2018 21:40:34 +0300 Subject: [PATCH 2/2] * fixed bug with mute at 0.0 --- MTMR/VolumeViewController.swift | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/MTMR/VolumeViewController.swift b/MTMR/VolumeViewController.swift index ee13dad..b73aeb7 100644 --- a/MTMR/VolumeViewController.swift +++ b/MTMR/VolumeViewController.swift @@ -84,18 +84,31 @@ class VolumeViewController: NSCustomTouchBarItem { } private func setInputGain(_ volume: Float32) -> OSStatus { - var inputVolume: Float32 = volume //0.0 //roundf(volume * 100) / 100 + 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() - if inputVolume == 0.0 { - address.mSelector = AudioObjectPropertySelector(kAudioDevicePropertyMute) - } else { - 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 {