Skip to content
Draft
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7242390
Restore point: VST3 wrapper with working GUI and settings dialog
Dec 26, 2025
7a79127
Restore Point: Refined Group Faders, Smoothed Auto-Level for New Clie…
Dec 28, 2025
493a487
Restore point: Channel strip UI and Layout updates
Dec 28, 2025
f2bf201
Restore Point: Custom reverb, fixed local channel, scroll arrows, UI …
Dec 28, 2025
b56c826
Add VST3 wrapper implementation with bootstrap shim and embedded reso…
Jan 21, 2026
eaeb444
Add JamulusPlus VST fork and support files
May 14, 2026
1320439
Add JamulusPlus GitHub Actions build workflow
May 14, 2026
da8ebff
Refine JamulusPlus settings layout and startup
May 14, 2026
7d8308f
Trigger JamulusPlus builds for release tags
May 14, 2026
784e220
Publish JamulusPlus release assets from tags
May 14, 2026
3cfdd79
Fix JamulusPlus CI submodule checkout
May 14, 2026
70cb947
Fix JamulusPlus GitHub Actions configure and submodule state
May 14, 2026
1dab0c6
Use native generators for JamulusPlus CI builds
May 14, 2026
5431b23
Split JamulusPlus CI targets and disable macOS signing
May 14, 2026
9817750
Fix JamulusPlus CI include paths and JUCE net headers
May 14, 2026
7783a60
Harden macOS CI signing settings
May 14, 2026
c8b089c
Add CLAP builds to JamulusPlus CI
May 14, 2026
aa8ea5d
Fix macOS JUCE File reset in recording state
May 14, 2026
4924366
Disable CLAP in JamulusPlus CI
May 14, 2026
d67e719
Add CLAP support to JamulusPlus
May 14, 2026
f88a373
Fix macOS CLAP build issues
May 14, 2026
81641dc
Fix macOS SRV resolver constants
May 14, 2026
9396e90
Support lowercase JamulusPlus release tags
May 14, 2026
4942222
Zip Windows standalone release from exe layout
May 15, 2026
7797988
Add combined Inno installer to Windows release
May 15, 2026
b673038
Remove obsolete NSIS toolchain
May 15, 2026
e47aff2
Remove legacy JUCE wrapper and old tool configs
May 15, 2026
f927958
Flatten repository to standalone JamulusPlus layout
May 15, 2026
de1e92b
Fix Windows installer artifact path
May 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
149 changes: 149 additions & 0 deletions .codacy/cli.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
#!/usr/bin/env bash


set -e +o pipefail

# Set up paths first
bin_name="codacy-cli-v2"

# Determine OS-specific paths
os_name=$(uname)
arch=$(uname -m)

case "$arch" in
"x86_64")
arch="amd64"
;;
"x86")
arch="386"
;;
"aarch64"|"arm64")
arch="arm64"
;;
esac

if [ -z "$CODACY_CLI_V2_TMP_FOLDER" ]; then
if [ "$(uname)" = "Linux" ]; then
CODACY_CLI_V2_TMP_FOLDER="$HOME/.cache/codacy/codacy-cli-v2"
elif [ "$(uname)" = "Darwin" ]; then
CODACY_CLI_V2_TMP_FOLDER="$HOME/Library/Caches/Codacy/codacy-cli-v2"
else
CODACY_CLI_V2_TMP_FOLDER=".codacy-cli-v2"
fi
fi

version_file="$CODACY_CLI_V2_TMP_FOLDER/version.yaml"


get_version_from_yaml() {
if [ -f "$version_file" ]; then
local version=$(grep -o 'version: *"[^"]*"' "$version_file" | cut -d'"' -f2)
if [ -n "$version" ]; then
echo "$version"
return 0
fi
fi
return 1
}

get_latest_version() {
local response
if [ -n "$GH_TOKEN" ]; then
response=$(curl -Lq --header "Authorization: Bearer $GH_TOKEN" "https://api.github.com/repos/codacy/codacy-cli-v2/releases/latest" 2>/dev/null)
else
response=$(curl -Lq "https://api.github.com/repos/codacy/codacy-cli-v2/releases/latest" 2>/dev/null)
fi

handle_rate_limit "$response"
local version=$(echo "$response" | grep -m 1 tag_name | cut -d'"' -f4)
echo "$version"
}

handle_rate_limit() {
local response="$1"
if echo "$response" | grep -q "API rate limit exceeded"; then
fatal "Error: GitHub API rate limit exceeded. Please try again later"
fi
}

download_file() {
local url="$1"

echo "Downloading from URL: ${url}"
if command -v curl > /dev/null 2>&1; then
curl -# -LS "$url" -O
elif command -v wget > /dev/null 2>&1; then
wget "$url"
else
fatal "Error: Could not find curl or wget, please install one."
fi
}

download() {
local url="$1"
local output_folder="$2"

( cd "$output_folder" && download_file "$url" )
}

download_cli() {
# OS name lower case
suffix=$(echo "$os_name" | tr '[:upper:]' '[:lower:]')

local bin_folder="$1"
local bin_path="$2"
local version="$3"

if [ ! -f "$bin_path" ]; then
echo "📥 Downloading CLI version $version..."

remote_file="codacy-cli-v2_${version}_${suffix}_${arch}.tar.gz"
url="https://github.com/codacy/codacy-cli-v2/releases/download/${version}/${remote_file}"

download "$url" "$bin_folder"
tar xzfv "${bin_folder}/${remote_file}" -C "${bin_folder}"
fi
}

# Warn if CODACY_CLI_V2_VERSION is set and update is requested
if [ -n "$CODACY_CLI_V2_VERSION" ] && [ "$1" = "update" ]; then
echo "⚠️ Warning: Performing update with forced version $CODACY_CLI_V2_VERSION"
echo " Unset CODACY_CLI_V2_VERSION to use the latest version"
fi

# Ensure version.yaml exists and is up to date
if [ ! -f "$version_file" ] || [ "$1" = "update" ]; then
echo "ℹ️ Fetching latest version..."
version=$(get_latest_version)
mkdir -p "$CODACY_CLI_V2_TMP_FOLDER"
echo "version: \"$version\"" > "$version_file"
fi

# Set the version to use
if [ -n "$CODACY_CLI_V2_VERSION" ]; then
version="$CODACY_CLI_V2_VERSION"
else
version=$(get_version_from_yaml)
fi


# Set up version-specific paths
bin_folder="${CODACY_CLI_V2_TMP_FOLDER}/${version}"

mkdir -p "$bin_folder"
bin_path="$bin_folder"/"$bin_name"

# Download the tool if not already installed
download_cli "$bin_folder" "$bin_path" "$version"
chmod +x "$bin_path"

run_command="$bin_path"
if [ -z "$run_command" ]; then
fatal "Codacy cli v2 binary could not be found."
fi

if [ "$#" -eq 1 ] && [ "$1" = "download" ]; then
echo "Codacy cli v2 download succeeded"
else
eval "$run_command $*"
fi
6 changes: 6 additions & 0 deletions .codacy/codacy.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
runtimes:
- python@3.11.11
- dart@3.7.2
tools:
- pylint@3.3.6
- dartanalyzer@3.7.2
35 changes: 35 additions & 0 deletions .gemini/restore_point_vst_stability.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Restore Point: VST Audio & Crash Fixes

## Current State
The project is a VST3 wrapper for Jamulus, built using JUCE. Recent work has focused on fixing audio routing bugs (Mute/Solo/Boost), ensuring persistent settings, and resolving a critical DAW crash during plugin unloading.

## Completed Tasks

### 1. Audio Logic & Mixer Fixes
- **Mute/Solo Fix**: Implemented stable tracking of Mute and Solo states in `JamulusGui.h`. Audio output is now correctly affected by these states, not just the meters.
- **Solo Burst Bug**: Resolved an issue where soloed channels would momentarily unmute when "Auto Level" was disabled. Logic is now centralized in the `timerCallback`.
- **Boost Functionality**: Fixed the Boost button to work correctly with and without Auto Level. For "Me", it uses the native Jamulus input boost; for remote users, it applies a digital +6dB gain.
- **Me Track Normalization**: Forced the local user's ID to `-1` for consistent local settings management, preventing settings from being lost when the server-assigned ID changed.

### 2. Networking & Responsiveness
- **Event Loop Processing**: Integrated `jamulus_process_events()` into the `timerCallback` (30Hz) to ensure Qt events (like gain/pan rate-limiting timers) fire correctly within the DAW environment.
- **Connection Stability**: Added a `jamulus_client_disconnect` call and a 100ms delay during re-connections to the same server to prevent audio loss/corrupted state.

### 3. Persistence
- **User Settings**: Implemented JSON-based persistence for per-user Gain, Pan, and Mono/Stereo settings.
- **Mixer State**: Profiles and general audio/network settings are correctly saved and loaded.

### 4. Stability & Crash Prevention (Plugin Unload)
- **Background Thread Management**: Added a virtual destructor to `WrapperClient` in `jamulus_wrapper.cpp` to ensure the audio worker thread is joined before the object is destroyed.
- **Qt Resource Lifecycle**: Added reference counting for global clients. The event pump timer and shared GUI dialogs are now stopped and cleaned up (using `deleteLater`) only when the last plugin instance is destroyed.
- **Ref-Counted Shutdown**: Implemented a "final pump" of the Qt event loop during the last client's destruction to handle final cleanup tasks before DLL unmapping.

## Core Files
- `JamulusGui.h`: Contains the main mixer UI, fader/button logic, and the centralized `timerCallback` for gain dispatching.
- `jamulus_wrapper.cpp`: Bridge between JUCE/C++ and the Jamulus Qt core. Handles audio FIFO, background threads, and Qt application lifecycle.
- `PluginProcessor.cpp`: Standard JUCE audio processor; manages the `jamulus_client` lifecycle and resampling.

## Next Steps
- **Validation**: Verify the unload stability in additional hosts (FL Studio, Ableton) if possible.
- **UI Polish**: Improve the "Chat" and "Settings" component aesthetics to match the main mixer.
- **Performance**: Monitor CPU usage of the `timerCallback` if the number of remote users is very high (>50).
72 changes: 72 additions & 0 deletions .github/instructions/codacy.instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
---
description: Configuration for AI behavior when interacting with Codacy's MCP Server
applyTo: '**'
---
---
# Codacy Rules
Configuration for AI behavior when interacting with Codacy's MCP Server

## CRITICAL: After ANY successful `edit_file` or `reapply` operation
- YOU MUST IMMEDIATELY run the `codacy_cli_analyze` tool from Codacy's MCP Server for each file that was edited, with:
- `rootPath`: set to the workspace path
- `file`: set to the path of the edited file
- `tool`: leave empty or unset
- If any issues are found in the new edits, propose and apply fixes for them.
- > NOTE: Failure to follow this rule is considered a critical error.

## When you tried to run the `codacy_cli_analyze` tool and the Codacy CLI is not installed
- Ask the user 'Codacy CLI is not installed. Would you like me to install it now?'
- If the user responds with "yes", run the `codacy_cli_install` tool and then continue with the original task
- If the user responds with "no", instruct the user that they can disable automatic analysis in the extension settings
- Wait for the user to respond before proceeding with any other actions

## After every response
- If you made any file edits in this conversation, verify you ran `codacy_cli_analyze` tool from Codacy's MCP Server

## When there are no Codacy MCP Server tools available, or the MCP Server is not reachable
- Suggest the user the following troubleshooting steps:
- Try to reset the MCP on the extension
- If the user is using VSCode, suggest them to review their Copilot > MCP settings in Github, under their organization or personal account. Refer them to Settings > Copilot > Enable MCP servers in Copilot. Suggested URL (https://github.com/settings/copilot/features) or https://github.com/organizations/{organization-name}/settings/copilot/features (This can only be done by their organization admins / owners)
- If none of the above steps work, suggest the user to contact Codacy support

## Trying to call a tool that needs a rootPath as a parameter
- Always use the standard, non-URL-encoded file system path

## CRITICAL: Dependencies and Security Checks
- IMMEDIATELY after ANY of these actions:
- Running npm/yarn/pnpm install
- Adding dependencies to package.json
- Adding requirements to requirements.txt
- Adding dependencies to pom.xml
- Adding dependencies to build.gradle
- Any other package manager operations
- You MUST run the `codacy_cli_analyze` tool with:
- `rootPath`: set to the workspace path
- `tool`: set to "trivy"
- `file`: leave empty or unset
- If any vulnerabilities are found because of the newly added packages:
- Stop all other operations
- Propose and apply fixes for the security issues
- Only continue with the original task after security issues are resolved
- EXAMPLE:
- After: npm install react-markdown
- Do: Run codacy_cli_analyze with trivy
- Before: Continuing with any other tasks

## General
- Repeat the relevant steps for each modified file.
- "Propose fixes" means to both suggest and, if possible, automatically apply the fixes.
- You MUST NOT wait for the user to ask for analysis or remind you to run the tool.
- Do not run `codacy_cli_analyze` looking for changes in duplicated code or code complexity metrics.
- Complexity metrics are different from complexity issues. When trying to fix complexity in a repository or file, focus on solving the complexity issues and ignore the complexity metric.
- Do not run `codacy_cli_analyze` looking for changes in code coverage.
- Do not try to manually install Codacy CLI using either brew, npm, npx, or any other package manager.
- If the Codacy CLI is not installed, just run the `codacy_cli_analyze` tool from Codacy's MCP Server.
- When calling `codacy_cli_analyze`, only send provider, organization and repository if the project is a git repository.

## Whenever a call to a Codacy tool that uses `repository` or `organization` as a parameter returns a 404 error
- Offer to run the `codacy_setup_repository` tool to add the repository to Codacy
- If the user accepts, run the `codacy_setup_repository` tool
- Do not ever try to run the `codacy_setup_repository` tool on your own
- After setup, immediately retry the action that failed (only retry once)
---
Loading