52fa522d6d
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...
55 lines
1.5 KiB
Swift
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
|
|
}
|
|
}
|