Add VU Server for external app control and improve auto-probing

- Add TCP server (VUServer.swift) for external apps to send VU meter values
- Server supports VU Protocol (#channel:value), JSON, and raw bytes
- Configurable options: port, max clients, remote access, broadcast levels
- Add ServerView.swift with full server settings UI and client management
- Improve auto-probing to use two-phase detection (port scan then protocol test)
- Fix termios c_cc tuple access using withUnsafeMutableBytes
- Add network and serial entitlements for server and USB access
- Update version to 1.2.0
This commit is contained in:
Claude
2025-12-14 15:23:50 +00:00
parent f5e266b22b
commit 0ecf2c7940
8 changed files with 1188 additions and 19 deletions
@@ -16,6 +16,8 @@
A100000D229E3D0000000007 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A100000E229E3D0000000007 /* Assets.xcassets */; };
A1000020229E3D0000000019 /* SerialManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1000021229E3D000000001A /* SerialManager.swift */; };
A1000022229E3D000000001B /* HardwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1000023229E3D000000001C /* HardwareView.swift */; };
A1000024229E3D000000001D /* VUServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1000025229E3D000000001E /* VUServer.swift */; };
A1000026229E3D000000001F /* ServerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1000027229E3D0000000020 /* ServerView.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@@ -31,6 +33,8 @@
A1000011229E3D000000000A /* AudioVUMeter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AudioVUMeter.app; sourceTree = BUILT_PRODUCTS_DIR; };
A1000021229E3D000000001A /* SerialManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SerialManager.swift; sourceTree = "<group>"; };
A1000023229E3D000000001C /* HardwareView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HardwareView.swift; sourceTree = "<group>"; };
A1000025229E3D000000001E /* VUServer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VUServer.swift; sourceTree = "<group>"; };
A1000027229E3D0000000020 /* ServerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -63,6 +67,8 @@
A100000C229E3D0000000006 /* SettingsView.swift */,
A1000021229E3D000000001A /* SerialManager.swift */,
A1000023229E3D000000001C /* HardwareView.swift */,
A1000025229E3D000000001E /* VUServer.swift */,
A1000027229E3D0000000020 /* ServerView.swift */,
A100000E229E3D0000000007 /* Assets.xcassets */,
A100000F229E3D0000000008 /* AudioVUMeter.entitlements */,
A1000010229E3D0000000009 /* Info.plist */,
@@ -155,6 +161,8 @@
A100000B229E3D0000000006 /* SettingsView.swift in Sources */,
A1000020229E3D0000000019 /* SerialManager.swift in Sources */,
A1000022229E3D000000001B /* HardwareView.swift in Sources */,
A1000024229E3D000000001D /* VUServer.swift in Sources */,
A1000026229E3D000000001F /* ServerView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -298,7 +306,7 @@
"$(inherited)",
"@executable_path/../Frameworks",
);
MARKETING_VERSION = 1.1;
MARKETING_VERSION = 1.2;
PRODUCT_BUNDLE_IDENTIFIER = com.audiotools.AudioVUMeter;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
@@ -327,7 +335,7 @@
"$(inherited)",
"@executable_path/../Frameworks",
);
MARKETING_VERSION = 1.1;
MARKETING_VERSION = 1.2;
PRODUCT_BUNDLE_IDENTIFIER = com.audiotools.AudioVUMeter;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;