|
1 | 1 | import Foundation |
| 2 | +import CoreAudio |
| 3 | +import Cocoa |
2 | 4 |
|
3 | 5 | public extension Notification.Name { |
4 | 6 | static let deviceIsRunningSomewhereDidChange = Self("deviceIsRunningSomewhereDidChange") |
5 | 7 | } |
6 | 8 |
|
7 | | - |
8 | 9 | final class AudioInput { |
9 | | - private var devices: Set<AudioDevice> |
10 | 10 | private var callback: (Bool) -> Void |
| 11 | + private var devices: Set<AudioDevice> { |
| 12 | + didSet { |
| 13 | + let added = devices.subtracting(oldValue) |
| 14 | + added.forEach { device in |
| 15 | + try? device.whenSelectorChanges(.isRunningSomewhere) { _ in |
| 16 | + NotificationCenter.default.post(name: .deviceIsRunningSomewhereDidChange, object: nil) |
| 17 | + } |
| 18 | + } |
| 19 | + } |
| 20 | + } |
11 | 21 |
|
12 | 22 | init(_ callback: @escaping (Bool) -> Void) { |
13 | 23 | self.devices = Set() |
14 | 24 | self.callback = callback |
15 | 25 | } |
16 | 26 |
|
17 | 27 | private func updateDeviceList() { |
18 | | - let input = try? AudioDevice.devices().filter({ try $0.supportsInput() }) |
19 | | - guard let input else { return } |
20 | | - let inputs = Set(input) |
21 | | - if (self.devices == inputs) { return } |
22 | | - |
23 | | - let added = inputs.subtracting(self.devices) |
24 | | - added.forEach { device in |
25 | | - try? device.whenSelectorChanges(.isRunningSomewhere) { _ in |
26 | | - NotificationCenter.default.post(name: .deviceIsRunningSomewhereDidChange, object: nil) |
27 | | - } |
28 | | - } |
| 28 | + let devices = AudioDevice.inputDevices() |
| 29 | + guard let devices else { return } |
| 30 | + guard devices != self.devices else { return } |
29 | 31 |
|
30 | | - self.devices = inputs |
| 32 | + self.devices = devices |
31 | 33 | } |
32 | 34 |
|
33 | 35 | private lazy var listener = Debouncer(delay: 0.5) { [weak self] in |
34 | 36 | guard let self else { return } |
35 | | - let isRunningSomewhere = try? self.devices.contains { try $0.isRunningSomewhere() } |
36 | | - self.callback(isRunningSomewhere ?? false) |
| 37 | + self.callback(self.devices.isRunningSomewhere() ?? false) |
37 | 38 | } |
38 | 39 |
|
39 | 40 | func startListener() { |
|
0 commit comments