diff --git a/MTMR/Assets.xcassets/brightnessDown.imageset/Contents.json b/MTMR/Assets.xcassets/brightnessDown.imageset/Contents.json new file mode 100644 index 0000000..cd7e69d --- /dev/null +++ b/MTMR/Assets.xcassets/brightnessDown.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "brightnessDown.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/MTMR/Assets.xcassets/brightnessDown.imageset/brightnessDown.png b/MTMR/Assets.xcassets/brightnessDown.imageset/brightnessDown.png new file mode 100644 index 0000000..a7bc8a9 Binary files /dev/null and b/MTMR/Assets.xcassets/brightnessDown.imageset/brightnessDown.png differ diff --git a/MTMR/Assets.xcassets/brightnessUp.imageset/Contents.json b/MTMR/Assets.xcassets/brightnessUp.imageset/Contents.json new file mode 100644 index 0000000..d038817 --- /dev/null +++ b/MTMR/Assets.xcassets/brightnessUp.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "brightnessUp.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/MTMR/Assets.xcassets/brightnessUp.imageset/brightnessUp.png b/MTMR/Assets.xcassets/brightnessUp.imageset/brightnessUp.png new file mode 100644 index 0000000..028aa26 Binary files /dev/null and b/MTMR/Assets.xcassets/brightnessUp.imageset/brightnessUp.png differ diff --git a/MTMR/ItemsParsing.swift b/MTMR/ItemsParsing.swift index d8d86a0..97845ec 100644 --- a/MTMR/ItemsParsing.swift +++ b/MTMR/ItemsParsing.swift @@ -44,8 +44,14 @@ class SupportedTypesHolder { typealias ParametersDecoder = (Decoder) throws ->(item: ItemType, action: ActionType, parameters: [GeneralParameters.CodingKeys: GeneralParameter]) private var supportedTypes: [String: ParametersDecoder] = [ "escape": { _ in return (item: .staticButton(title: "esc"), action: .keyPress(keycode: 53), parameters: [.align: .align(.left)]) }, - "brightnessUp": { _ in return (item: .staticButton(title: "🔆"), action: .keyPress(keycode: 113), parameters: [:]) }, - "brightnessDown": { _ in return (item: .staticButton(title: "🔅"), action: .keyPress(keycode: 107), parameters: [:]) }, + "brightnessUp": { _ in + let imageParameter = GeneralParameter.image(source: #imageLiteral(resourceName: "brightnessUp")) + return (item: .staticButton(title: ""), action: .keyPress(keycode: 113), parameters: [.image: imageParameter]) + }, + "brightnessDown": { _ in + let imageParameter = GeneralParameter.image(source: #imageLiteral(resourceName: "brightnessDown")) + return (item: .staticButton(title: ""), action: .keyPress(keycode: 107), parameters: [.image: imageParameter]) + }, "volumeDown": { _ in let imageParameter = GeneralParameter.image(source: NSImage(named: .touchBarVolumeDownTemplate)!) return (item: .staticButton(title: ""), action: .hidKey(keycode: NX_KEYTYPE_SOUND_DOWN), parameters: [.image: imageParameter]) 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 {