Skip to content

Streamdeck integration#205

Open
LvcasX1 wants to merge 7 commits intoronitsingh10:mainfrom
LvcasX1:streamdeck-integration
Open

Streamdeck integration#205
LvcasX1 wants to merge 7 commits intoronitsingh10:mainfrom
LvcasX1:streamdeck-integration

Conversation

@LvcasX1
Copy link
Copy Markdown

@LvcasX1 LvcasX1 commented Mar 29, 2026

This pull request introduces a Stream Deck integration via a WebSocket bridge, enabling real-time control and monitoring of per-app and master audio states from external clients (e.g., a Stream Deck plugin). It also improves app process resolution for Electron-based apps, adds a utility for value clamping, and includes a minor UI enhancement. Entitlements are updated to allow incoming network connections required for the WebSocket server.

Stream Deck Integration and WebSocket Communication:

  • Implements StreamDeckBridge, a new class that exposes the audio engine's state and controls over a WebSocket server, supporting real-time state and audio level updates, as well as remote commands for per-app and master volume/mute control. [1] [2]
  • Integrates the bridge into the app's lifecycle, starting it at launch and wiring it to the audio engine. [1] [2]
  • Updates app entitlements to allow the app to accept incoming network connections, which is required for the WebSocket server.

Audio Process Resolution Improvements:

  • Enhances helper process resolution for Electron-based apps (e.g., Discord, Slack, VS Code) by matching bundle ID prefixes, improving accuracy of app identification and icon retrieval. [1] [2]

Utilities and UI:

  • Adds a generic clamped(to:) extension for Comparable types to safely constrain values within a range, used for volume normalization.
  • Minor UI tweak: disables the focus effect on the menu bar popup view for a cleaner appearance.

LvcasX1 added 7 commits March 29, 2026 16:39
Nested .app bundles (e.g., Discord Helper (Renderer).app inside
Discord.app/Contents/Frameworks/) were incorrectly treated as
top-level apps. Add path-based check and bundle ID prefix fallback
to correctly resolve helpers to their parent app.
Track previously-seen apps and include them in state broadcasts with
isActive flag and persisted settings. Allow volume/mute commands for
inactive apps via SettingsManager. Increase levels timer to 30fps.
The NSPanel becomes key when shown, causing macOS to draw a blue
focus ring on the first focusable control. Suppress this with
focusEffectDisabled() since the popover is mouse-driven.
Move loggers from file-scope to instance properties using
Bundle.main.bundleIdentifier, remove unused AudioToolbox import,
cache JSONEncoder, move Comparable.clamped(to:) to Utilities,
replace unused range binding with .contains(), fix extra blank lines.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant