Files
Ai/AudioVUMeter/AudioVUMeter/AudioVUMeterApp.swift
T
Claude 52fa522d6d Add physical VU meter hardware support (4 dials)
New features:
- SerialManager for USB/Serial communication with hardware
- Support for 4 physical VU meter dials
- Flexible channel mapping: Audio L/R, Peak, Mono, CPU, RAM, Disk, Network
- Multiple protocols: Raw bytes, Text, JSON, VU-Server compatible
- Per-dial configuration: min/max values, inversion, smoothing
- Hardware panel in main view showing dial status
- Hardware settings sheet for configuration
- Auto-detection of USB serial devices

Protocol formats:
- Raw: [0xAA][D1][D2][D3][D4][0x55]
- Text: CH1:val;CH2:val;CH3:val;CH4:val\n
- JSON: {"dials":[d1,d2,d3,d4]}
- VU-Server: #0:val\n#1:val\n...
2025-12-14 10:15:20 +00:00

55 lines
1.5 KiB
Swift

//
// AudioVUMeterApp.swift
// AudioVUMeter
//
// macOS Audio VU Meter with System Monitoring
// Captures audio from BlackHole virtual audio device
// Outputs to physical VU meter hardware via Serial/USB
//
import SwiftUI
@main
struct AudioVUMeterApp: App {
@StateObject private var audioEngine = AudioEngine()
@StateObject private var systemMonitor = SystemMonitor()
@StateObject private var serialManager = SerialManager()
// Timer for updating hardware values
@State private var updateTimer: Timer?
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(audioEngine)
.environmentObject(systemMonitor)
.environmentObject(serialManager)
.onAppear {
startHardwareUpdateTimer()
}
.onDisappear {
stopHardwareUpdateTimer()
}
}
.windowStyle(.hiddenTitleBar)
.windowResizability(.contentSize)
Settings {
SettingsView()
.environmentObject(audioEngine)
.environmentObject(serialManager)
}
}
private func startHardwareUpdateTimer() {
updateTimer = Timer.scheduledTimer(withTimeInterval: 1.0/30.0, repeats: true) { _ in
serialManager.updateValues(audioEngine: audioEngine, systemMonitor: systemMonitor)
}
}
private func stopHardwareUpdateTimer() {
updateTimer?.invalidate()
updateTimer = nil
}
}