Skip to content

Instantly share code, notes, and snippets.

@mxmilkiib
Last active April 1, 2026 19:18
Show Gist options
  • Select an option

  • Save mxmilkiib/9c883e2022e978d9098311cbe4e2f875 to your computer and use it in GitHub Desktop.

Select an option

Save mxmilkiib/9c883e2022e978d9098311cbe4e2f875 to your computer and use it in GitHub Desktop.
Carla integration branch configuration

Carla Integration Branch Configuration

Last updated: 2026-04-01 (session 19) URL: https://gist.github.com/mxmilkiib/9c883e2022e978d9098311cbe4e2f875 RFC 2119

Overview / rules

  • Purpose: This document tracks Milkii's personal Carla development setup, for creating and testing feature and bugfix branches.
  • Living document: This is a living document and SHOULD be updated as the workflow evolves.
  • Single repo: The goal is to maintain one Carla source instance at /home/milkii/media/projects/cascade/carla with both an integrated branch and individual feature/fix branches.
  • Main sync: The main branch MUST maintain sync with falktx/Carla main. origin/main MUST be kept as a fast-forward mirror of upstream/main — run git push --no-verify origin main after every git fetch upstream && git merge upstream/main on main.
  • Main read-only: The main branch MUST NOT receive any local commits — not INTEGRATION.md updates, not patches, nothing. All commits go on integrated or a feature/fix branch. Any stray commits on main MUST be removed by force-pushing the clean upstream/main tip.
  • Integration branch: The repo MUST have an integrated branch that combines multiple upstream PR branches and local feature/fix branches.
  • Individual branches: Each feature/fix MUST have its own branch, kept clean for upstream PRs. Branch out from upstream/main, never from local main.
  • Dev location: All individual branch development is done in the same repo — checkout the branch, work, push, switch back to integrated for builds.
  • Integration edits: integrated can have some edits for testing purposes, but should be kept minimal.
  • Clean commits: A branch MUST have clean commits before first being linked with a GitHub PR.
  • Stability: The integrated branch SHOULD provide a stable bleeding-edge build combining desired upstream PRs and local improvements.
  • "Updating" the system: When asked to "update" or told the system has been updated, this MUST include all post-update checks in order:
    1. Fetch upstream and check for new commits on upstream/main
    2. Check all [x] branches: verify whether commits are already present in upstream/main (git log upstream/main --oneline | grep <keyword>); if fully merged, move the entry to "Merged to Upstream", remove the [x] marker, and record the merge date — do this BEFORE rebasing or rebuilding
    3. Rebase all non-merged feature branches on new upstream/main (stash any WIP first); skip branches identified as merged in step 2
    4. Rebuild the integrated branch: merge upstream/main then re-merge all [x] branches in order, resolving any conflicts
    5. Build the integrated branch (make -j$(nproc --ignore=2)) and verify it succeeds
    6. Check all open PRs for new review feedback and update INTEGRATION.md statuses accordingly
    7. Update the "Last updated" timestamp and rebuild log entry in INTEGRATION.md, commit, and sync to Gist
  • Merge process: The integration merge process MUST follow the steps in the Integration Merge Process section below.
  • Rebase hygiene: All branches SHOULD be kept up-to-date and rebased with falktx/Carla main to minimise merge conflicts, except merged branches.
  • Rebase first: A branch MUST be rebased as an initial step before any new change is made to said branch.
  • Incremental PRs: Changes to falktx/Carla PRs MUST be incremental so as to be easy to review, and MUST NOT completely reformulate a system in a single commit.
  • Outline currency: The integration status outline MUST reflect the state of all branches, related issues, PRs, and dates, and MUST be updated after changes are committed — PR URLs SHOULD be checked first to catch new feedback.
  • Non-interactive git: Git operations MUST be non-interactive using GIT_EDITOR=true and GIT_PAGER=cat to avoid vim/editor prompts.
  • Issues: Most branches MAY have related upstream issues; related issues SHOULD be listed in the outline.
  • Sections: Feature and fix branches should be in the correct outline sections.
  • Secondary patches: Secondary patches are small fixes that either (a) resolve a residual problem that only became visible after a larger fix landed, or (b) are a prerequisite that a main fix branch depends on. They MUST be tracked in the Secondary Patches section of the outline, with a Depends-on or Resolves-residual-from note linking them to the related primary branch.
  • Secondary patch upstream: A secondary patch SHOULD be submitted upstream independently if it stands alone; if it only makes sense in context of the primary fix, it MAY be folded into that PR.
  • Dates: Dates for branch creation, last PR comment, and last update MUST be recorded in the status outline.
  • Standalone branches: Each feature/fix branch SHOULD work standalone without depending on other local branches (except where noted).
  • History: Feature/fix branch history MUST NOT be rewritten (no squash, no interactive rebase) without explicit permission from Milkii. "Complete" means the upstream PR has been merged or the branch has been deliberately closed. The integrated branch MAY have merge commits.
  • No cherry-pick: ALWAYS use git merge to bring branches into integrated, NEVER git cherry-pick — cherry-picking creates duplicate commits with different SHAs, severs the branch relationship, makes bisect/revert unreliable, and hides what is actually in the build from git log.
  • Dependencies: Any fix or feature branch that relies on another local branch MUST be noted in the Branch Dependencies section.
  • PR flow: PRs SHOULD be submitted to mxmilkiib/Carla, and Milkii will create a further PR from there to falktx/Carla.
  • Merged cleanup: Once the PR is fully merged into falktx/Carla, the branch entry MUST be moved to the "Merged to Upstream" section of the outline and its [x] marker removed, so it is excluded from future integration rebuilds.
  • Last updated: The "Last updated" date at the top of this file MUST be updated whenever this file is edited.
  • Gist sync: If this file is updated, it MUST be synced to Gist: run gh gist edit 9c883e2022e978d9098311cbe4e2f875 --filename INTEGRATION.md INTEGRATION.md from /home/milkii/media/projects/cascade/carla/ (--filename targets the gist file, the positional arg supplies the local content).
  • Commit messages: Commit messages must not be too verbose, and should be concise and descriptive.
  • Conflict resolution: When resolving merge conflicts — whether during rebases or integration merges — conflicts MUST be resolved and the operation continued non-interactively.
  • Code quality: Code quality MUST be verified before pushing — C++ code MUST follow Carla/JUCE coding style; Python code SHOULD pass pylint without new warnings.
  • Push permission: Permission MUST be sought from the user before pushing commits to GitHub. Once the user has confirmed a push in a session, further pushes in that same session MAY proceed without asking again, to reduce friction.
  • Local-only backup: All local branches MUST be pushed to origin (mxmilkiib/Carla) for off-machine backup, even if they will never be PRed upstream.

Branch Hygiene

CRITICAL: Feature branches MUST only contain commits belonging to their named feature.

  • NEVER commit INTEGRATION.md, integration merge commits, or unrelated fixups into a feature branch.
  • INTEGRATION.md MUST NOT be committed to any feature branch.
  • Before making any edit on a feature branch, confirm the active branch:
    git -C /home/milkii/media/projects/cascade/carla branch --show-current
    
  • To verify a branch is clean (only its own commits ahead of upstream/main):
    git -C /home/milkii/media/projects/cascade/carla log --oneline upstream/main..HEAD
    
  • If a branch has accumulated cruft, reset it:
    • No real feature commits yet: git reset --hard upstream/main
    • Has real commits mixed with cruft: rebase only the feature commits onto upstream/main, then force-update the branch ref

Preventing Cross-Branch Contamination

  • ALWAYS create new feature branches from upstream/main, never from local main — local main may have INTEGRATION.md commits or other local-only changes:
    git fetch upstream
    git checkout -b feature/<branch-name> upstream/main
    
  • Before committing WIP, verify the branch is correct AND that the diff contains only changes belonging to that feature:
    git diff --stat
    git branch --show-current
    
  • Before opening or updating a PR, verify the branch contains only its own commits relative to upstream/main:
    git log --oneline feature/<branch-name> --not upstream/main
    

Directory Structure

/home/milkii/media/projects/cascade/carla/
  main        ← fast-forward mirror of upstream/main
  integrated  ← combined bleeding-edge build branch
  feature/*   ← individual feature/fix branches

Branch Base Policy

Every fix or feature commit must be classified at creation time:

Base When to use Can upstream PR?
upstream/main Bug exists in upstream/main; fix cherry-picks cleanly Yes
integrated Bug was introduced by a PR merge into integrated; upstream/main does not have the regression; cherry-pick conflicts No — stays as a direct commit to integrated

To test which base to use: git cherry-pick <fix-commit> onto a fresh upstream/main branch. If it conflicts or the patch is a no-op (upstream already fixed), it is integrated-base.

integrated-base fixes do not get their own named branch. They are committed directly to integrated and tracked in the Integrated-Only Regression Fixes table below.

Branch Dependencies

None currently. If a branch depends on another local branch, it MUST be listed here and noted in the outline entry.

Branches with dependencies on other local branches cannot be submitted upstream as-is. They MUST be refactored to remove the dependency, or the dependency MUST be upstreamed first.

Integrated-Only Regression Fixes

These are direct commits on integrated that fix regressions introduced by PR merges. They cannot be submitted upstream and have no standalone branch. Cherry-picking them to upstream/main will conflict or be a no-op.

Commit Introduced by Regression Files
aa212b5d3 pr-1397 (port-groups) PatchbayPortAddedCallback/PatchbayPortChangedCallback emits passed 4 args to 5-arg signals; slot_handlePatchbayPortChangedCallback missing portGroupId param → repeated TypeError in carla-jack-* on every JACK port event carla_host.py
09a5e7a82 pr-1397 (port-groups) slot_handlePatchbayPortGroupAddedCallback body referenced portFlags after pr-1397 renamed the param to portGroupFlagsNameError on every port-group add event carla_host.py
4280b36af pr-1397 (port-groups) slot_handlePatchbayPortGroupChangedCallback was a no-op stub; now schedules slot_canvasRefresh via QTimer.singleShot since patchcanvas has no incremental port-group rename API carla_host.py
374c7a95a feature/2026.03mar.30-disk-tree-collapse-persist slot_fileTreeExpanded/slot_fileTreeCollapsed decorated with @pyqtSlot(object) — incompatible with expanded(QModelIndex) signal; changed to @pyqtSlot(QModelIndex) carla_host.py

Branch and Integration Status Outline

Summary: 0 need attention, 0 awaiting review, 24 local-only, 0 secondary patches, 14 upstream PRs merged to integrated, 0 merged upstream

Integration built 2026-04-01 (session 19): hardware node placement off-canvas bugfix; 77 tests passing. Qt6 frontend active: qt_config.py regenerated to qt = 6; make generate-ui regenerates ui_*.py with pyuic6; make check verifies syntax + UI import; make test runs pytest suite (tests/test_frontend.py 17 + tests/test_settings_dialog.py 15 + tests/test_executables.py 7 + tests/test_plugin_browser.py 19 + tests/test_disk_tree.py 19 = 77 tests; offscreen Qt). Patchbay port signal fix: PatchbayPortAddedCallback and PatchbayPortChangedCallback emits were missing value3 (portGroupId); slot_handlePatchbayPortChangedCallback was missing the portGroupId param. Caused repeated TypeError in carla-jack-multi/carla-jack-single on every JACK port event. GitHub Actions IRC notification disabled on fork via if: false in .github/workflows/irc.yml. SOURCE_MAP.md: navigational outline of all Carla source subsystems. Run workflow: .windsurf/workflows/run-carla.md. Previous build 2026-03-27: merged all 14 open upstream PRs (#1397 port-groups, #1426 python-compileall, #1483 disconnect-group, #1483 unordered-events, #1555 handle-events, #1658 sigusr2-bridge, #1690 meson-build, #1734 pyqt-import-fix, #1748 pipewire-connections, #1975 vst-param-align, #1987 cygwin-fix, #2010 rack-ui-rework, #2011 osc-named-plugins, #2020 param-labels); fixed two build errors (d_msleep, DISTRHO::String::buffer()); build clean.

Upstream PRs in Integration (merged to integrated, not yet to upstream/main)

These are upstream PRs that have been merged into integrated for local use. They are NOT local branches — they are tracked PR branches. They do not need rebasing, but MUST be re-merged if the integrated branch is rebuilt.

  • pr-1397 — port groups canvas (26 commits) — merged 2026-03-27
  • pr-1426 — compile Python files to __pycache__ on install — merged 2026-03-27
  • pr-1483 — disconnect-all-of-group patchbay menu item — merged 2026-03-27
  • pr-1555 — handle unordered add/position-change events — merged 2026-03-27
  • pr-1658 — SIGUSR2 handler in bridge plugin to re-load state — merged 2026-03-27
  • pr-1690 — meson build config for host plugin and discovery — merged 2026-03-27
  • pr-1734 — PyQt 5.15.8 PYQT_VERSION_STR import fix — merged 2026-03-27
  • pr-1748 — fix empty connections bug on PipeWire — merged 2026-03-27
  • pr-1834 — open recent file menu — merged 2026-03-27
  • pr-1975 — VST params UI: left-align param titles — merged 2026-03-27
  • pr-1987 — fix support for CYGWIN — merged 2026-03-27
  • pr-2010 — rack UI rework (jpka import) — merged 2026-03-27
  • pr-2011 — OSC: address plugins by name — merged 2026-03-27
  • pr-2020 — parameter labels when running as plugin — merged 2026-03-27

Needs Attention (CHANGES_REQUESTED)

(none)

Secondary Patches

(none)

Open PRs (REVIEW_REQUIRED)

(none yet)

Local Only (No PR yet)

All entries here are based on upstream/main and are upstream-submittable unless marked [integrated-base]. These branches are pushed to mxmilkiib/Carla and merged into integrated, but no upstream PR has been filed.

  • bugfix/2026.03mar.29-lv2-program-changed-deadlock — remove re-entrant lock in handleProgramChanged (#1968) — merged 2026-03-30
  • bugfix/2026.03mar.29-file-open-default-folder — validate project folder before Open dialog (#2019) — merged 2026-03-30
  • bugfix/2026.03mar.29-qt6-precedence-over-qt5 — guard Qt5 detection so Qt6 wins on dual-Qt systems (#2031) — merged 2026-03-30
  • bugfix/2026.03mar.29-install-vst2-glob-guard — shell-guard VST2 install glob in make install (#1991) — merged 2026-03-30
  • feature/2026.03mar.29-log-missing-plugin-uri — include type/binary/label in missing-plugin error (#1499) — merged 2026-03-30
  • feature/2026.03mar.29-dsp-bar-refresh-rate — independent DSP bar refresh timer + settings spinbox (#1482) — merged 2026-03-30
  • feature/2026.03mar.29-patchbay-canvas-autosize — expand scene rect after restoring group positions (#1481) — merged 2026-03-30
  • feature/2026.03mar.29-patchbay-drag-scroll — auto-scroll canvas during rubberband drag near edge (#1577) — merged 2026-03-30
  • feature/2026.03mar.30-default-session-on-open — load configured default project on startup when no CLI arg given (#1929) — merged 2026-03-30
  • bugfix/2026.03mar.30-lv2-native-scalepoints — populate scalepoints in CarlaEngineNative::getParameterInfo() (#1976/#1984) — merged 2026-03-30
  • bugfix/2026.03mar.30-svg-text-qt6-crash — strip <text>/<flowRoot> from canvas.svg + pb_clementine.svg; Qt6 SVG renderer segfaults on zero-size or missing-font glyphs — merged 2026-03-30
  • bugfix/2026.03mar.30-exec-deprecated-qt6 — replace all 12 exec_() calls with exec() throughout the Python frontend; Qt6 deprecated the underscore form — merged 2026-03-30
  • feature/2026.03mar.30-start-with-patchbay — new Main/StartWithPatchbay setting + ch_main_start_patchbay checkbox; startup tab activates patchbay when set; projectLoadingFinished schedules slot_canvasZoomFit 300 ms after canvas refresh to centre the viewport on spawned nodes — merged 2026-03-30
  • feature/2026.03mar.30-plugin-browser-sidebar — new w_plugins tab in the side panel tabUtils; carla_plugin_browser.py widget enumerates PLUGIN_INTERNAL + PLUGIN_LV2 via gCarla.utils; search bar + type filter; double-click emits pluginActivated(dict); drag from list to patchbay view calls host.add_plugin() and positions the node via patchcanvas.setGroupPos at the drop point — merged 2026-03-30
  • bugfix/2026.03mar.30-settings-bool-syncQSafeSettings.value() now explicitly converts raw string "true"/"false" returns to Python bool; fixes StartWithPatchbay (and any other bool setting) silently falling back to defaultValue on PyQt6 builds where type coercion returns a str — merged 2026-03-30
  • feature/2026.03mar.30-disk-tree-collapse-persistfileTreeView expanded dirs persisted across restarts via fExpandedDirs set + DiskExpandedDirs QSettings key; b_disk_collapse button added to disk tab header (Collapse All); slot_fileTreeExpanded/slot_fileTreeCollapsed track state; _restoreExpandedDirs schedules restore 300 ms after load via QTimer; RAYSESSION_NOTES.md survey of implementable RaySession features — merged 2026-03-30
  • bugfix/2026.03mar.30-jack-timebase-nframes — guard nframes > 0 at the call site in handleJackTimebaseCallback before passing to fillJackTimeInfo; eliminates noisy CARLA_SAFE_ASSERT_RETURN(newFrames > 0) messages when JACK calls the timebase callback during transport relocation — merged 2026-03-30
  • bugfix/2026.04apr.01-hw-placement-before-addgroup_canvas_hardware_zone_bottom() was called after addGroup, so it scanned the just-added node at its random CanvasGetNewGroupPos position; if collision-avoidance pushed that to a large y the entire hardware zone stacked from there, placing nodes off-canvas and blowing out the minimap; fix: compute hw_y before addGroup — merged 2026-04-01
  • bugfix/2026.04apr.01-canvasport-qt-versioncanvasport.py setPortName() used QT_VERSION at line 141 but never imported it; canvasbox.py and scene.py both import it correctly from PyQt5/6.QtCore — added to match — merged 2026-04-01
  • feature/2026.03mar.31-plugins-tab-hardware-placementui_carla_host.py: w_plugins moved from tw_miniCanvas to tabUtils (now sits alongside Disk + Transport); retranslateUi label updated; _BELOW_ALL_CLIENTS extended with midi-bridge, a2j, a2jmidid, ble midi, bluetooth midi; _canvas_hardware_zone_bottom() places ICON_HARDWARE nodes 35% above canvas centre, centred X, split nodes symmetric at ±350; act_canvas_save_image gains Ctrl+Shift+I shortcut — merged 2026-03-31
  • feature/2026.03mar.31-raysession-search-xrunpatchcanvas.filterGroupsByName(text) dims non-matching group widgets to 0.15 opacity (clears on empty text); fCanvasSearchBar QLineEdit overlay on canvas, Ctrl+F shows it top-right, Esc clears and hides; slot_handleProjectLoadFinishedCallback calls clear_engine_xruns() on load — merged 2026-03-31
  • feature/2026.03mar.31-canvas-node-placementCanvasGetNewGroupPos uses a 160×30 footprint-rect intersect check instead of point-in-rect to prevent node overlap; line_null/line_null_sel amber-yellow added to all 5 theme variants; else fallback in canvasline.py + canvasbezierline.py for PORT_TYPE_NULL cables; _BELOW_ALL_CLIENTS (plasmashell, pavucontrol) placed below all other nodes via _canvas_max_node_bottom() in slot_handlePatchbayClientAddedCallback — merged 2026-03-31
  • feature/2026.03mar.31-canvas-fit-paddingzoom_fit now adds 12% padding (min 50 scene units) to the fitInView rect; returns padded QRectF; slot_canvasZoomFit uses it to call miniCanvasPreview.setRenderSource(fit) re-centring the minimap on the node cluster; CanvasPreviewFrame.setRenderSource(rect) added — merged 2026-03-31
  • feature/2026.03mar.31-canvas-autozoom-plugin-autoloadslot_handleEngineStartedCallback: schedule slot_canvasZoomFit 1 s after engine start so initial JACK nodes are centred without user action; schedule fPluginBrowser.refresh() 500 ms after engine start; slot_tabUtilsChanged lazy-loads the browser the first time the Plugins tab is selected; initial status label changed to "Waiting for engine..." — merged 2026-03-31

Merged to Upstream

(none yet — all local feature work is pending)


TODO Summary

  • Needs Attention (0 branches): (none)
  • Awaiting Review (0 branches): (none)
  • Local Development (24 branches): lv2-deadlock, file-open-folder, qt6-precedence, install-vst2-glob, log-missing-uri, dsp-refresh, canvas-autosize, drag-scroll, default-session-on-open, lv2-native-scalepoints, svg-text-qt6-crash, exec-deprecated-qt6, start-with-patchbay, plugin-browser-sidebar, settings-bool-sync, disk-tree-collapse-persist, jack-timebase-nframes, canvas-autozoom-plugin-autoload, canvas-fit-padding, canvas-node-placement, raysession-search-xrun, plugins-tab-hardware-placement, canvasport-qt-version, hw-placement-before-addgroup
  • Secondary Patches (0 branches): (none)

See Feature Request Branch TODO section at the end of this file for planned work.

Testing Checklist (Before Pushing to PR upstream)

Pre:

  • Branch rebased on latest falktx/Carla main

During:

  • Builds without errors (make -j$(nproc --ignore=2))
  • No new compiler warnings or pylint regressions
  • Basic functionality tested

Post:

  • No regressions in related features

Batch Branch Update Process

This process updates all local feature/fix branches to latest upstream:

  • Upstream MUST be fetched first: git fetch upstream
  • For each feature branch:
    • The branch MUST be rebased on upstream/main: git rebase upstream/main
    • Conflicts MUST be resolved if any occur
    • The rebased branch SHOULD be force-pushed to origin: git push --force-with-lease origin HEAD
    • The "Rebased" date in INTEGRATION.md MUST be updated
  • Branches with unresolved conflicts SHOULD be noted for later attention
  • After all branches are updated, the Integration Merge Process SHOULD be run

Integration Merge Process

This process merges all [x] marked branches into the integrated branch for a combined build.

Steps

  1. Commit pending INTEGRATION.md changes (if any) before starting:

    git add INTEGRATION.md && git commit -m "update INTEGRATION.md before integration"
    
  2. Fetch upstream:

    git fetch upstream
    
  3. Rebase all local feature branches on upstream/main (skip upstream PR branches — they are not rebased).

  4. Checkout the integrated branch:

    git checkout integrated
    
  5. Merge upstream/main into integrated (merge, not rebase, to preserve integration history):

    git merge upstream/main
    
  6. Re-fetch upstream PR branches:

    git fetch upstream '+refs/pull/*/head:refs/remotes/pr/*'
    
  7. Merge each [x] upstream PR branch:

    git merge --no-ff pr-<N> -m "Merge PR #<N>: <title>"
    
  8. Merge each [x] local feature branch:

    git merge --no-ff origin/<branch-name>
    
  9. Resolve merge conflicts carefully. Common issues:

    • Qt import blocks: keep the qt_compat version supporting both PyQt5 and PyQt6
    • C++ callback signatures: keep the newer/more complete version
    • Action constants in patchcanvas/__init__.py: preserve existing constants and insert new ones after, renumbering the rest
  10. Update INTEGRATION.md:

    • Change [ ] to [x] for newly merged branches
    • Update "Rebased" and "Updated" dates to today
    • Update the summary line counts
    • Update the "Last updated" date at the top
  11. Build and verify:

    make -C /home/milkii/media/projects/cascade/carla -j$(nproc --ignore=2)
    

    Full clean rebuild (when Makefile or new source files are involved):

    make -C /home/milkii/media/projects/cascade/carla clean
    make -C /home/milkii/media/projects/cascade/carla -j$(nproc --ignore=2)
    

    Basic functionality SHOULD be tested after build.

  12. Sync to Gist (if INTEGRATION.md was updated):

    gh gist edit 9c883e2022e978d9098311cbe4e2f875 --filename INTEGRATION.md INTEGRATION.md
    

Checking PR Status

gh pr view <PR-number> --repo falktx/Carla
gh pr list --repo falktx/Carla --author mxmilkiib
gh issue list --repo falktx/Carla --author mxmilkiib

Outline Format Reference

This section documents the structure of this file for AI assistants and future maintainers.

Branch Entry Format

Branch naming convention: feature/YYYY.MMmon.DD-thing-descriptive-title

- [x] **branch-name** - [#PR](url) - STATUS - Issue: [#ISSUE](url) - Optional description - Created: YYYY-MM-DD, Last comment: YYYY-MM-DD, Rebased: YYYY-MM-DD, Updated: YYYY-MM-DD - Next: Action item - Specifics: - Details about the branch and what probably should happen next
  • [x] = merged to integration, [ ] = not merged
  • Branch name in bold
  • Issue link to related Carla issue/feature request (if applicable)
  • Created date required for all branches
  • Last comment date shows most recent PR comment ("none" if no comments), only for PRs
  • Rebased date shows when branch was last rebased on falktx/Carla main ("none" if never)
  • Updated date tracks last modification to branch
  • Next action describes what needs to be done for this branch
  • Within each section: [x] (integrated) branches first, then [ ] (not integrated) branches
  • Within each group ([x] or [ ]), sort by updated date (newest first)
  • STATUS is one of: DRAFT, REVIEW_REQUIRED, CHANGES_REQUESTED, MERGED, LOCAL_ONLY
  • Secondary patch entries use Resolves-residual-from or Depends-on instead of Issue to link to the primary branch

Section Order

  1. Upstream PRs in Integration
  2. Needs Attention (CHANGES_REQUESTED)
  3. Secondary Patches
  4. Open PRs (REVIEW_REQUIRED)
  5. Local Only (No PR)
  6. Merged to Upstream

Summary Line

When updating integration: Update the "Last updated" date at the top of this file. Update the summary line at the top when adding/removing branches:

**Summary**: X need attention, Y awaiting review, Z local-only, W secondary patches, V upstream PRs in integrated, U merged upstream

Qt6 Status

Upstream (falktx/Carla main) is actively merging Qt6 compatibility:

  • qt_compat.py and per-file PyQt5/PyQt6 conditional imports already in place across the frontend.
  • Recent upstream commits: "Import qt6 fixes from ui-rework branch", "Fix QGLWidget import for PyQt6", "Fix carla-plugin embed usage in Qt6".
  • No separate local Qt6-prep branch is needed; stay current with upstream/main.
  • When adding new frontend code, follow the existing pattern in qt_compat.py: import from whichever PyQt version is active (qt_config == 5 / qt_config == 6).

Upstream Branches to Watch

  • rack-ui-rework (falktx) — 11 commits ahead of main (last: 2025-08-03). Imports jpka's rack UI rework, removes the "forth" API, and carries Qt6 fixes not yet on main. Worth merging to integrated once it stabilises. Monitor for merge.
  • custom-patchbay-ports (falktx, 2017) — 2 commits: adds configurable audio/midi port counts to Carla-Patchbay via CarlaEngineJack.cpp. Old and likely bitrotted, but the concept is still open. Noted for reference only; not suitable for integrated as-is.

Feature Request / Bugfix Branch TODO

Issues filed on falktx/Carla, ordered within each section by importance then hardness. PRs target mxmilkiib/Carla before falktx/Carla. [x] = branch created, pushed to mxmilkiib/Carla, ready to submit upstream.

Difficulty:

  • [easy] — 1–2 files, contained, well-understood path
  • [medium] — multiple files, needs design, crosses Python/C++ boundary
  • [hard] — new subsystem layer, platform-specific, or architectural dependency
  • [arch] — requires new cross-layer API or new subsystem; not a simple branch

Bugfixes (all authors)

Items ordered: crash risk first, then build/install, then UX regressions.

  • #1968 — LV2 program_changed deadlock when index == -1 [easy]

    • handleProgramChanged(-1) took ScopedSingleProcessLocker, then called reloadPrograms which calls setMidiProgram, which takes the same lock — deadlock.
    • Fix: removed the outer lock; setMidiProgram protects itself internally.
    • Files: source/backend/plugin/CarlaPluginLV2.cpp (handleProgramChanged)
    • Branch: bugfix/2026.03mar.29-lv2-program-changed-deadlock
  • #2019 — "Open" dialog ignores default project folder [easy]

    • On first open after launch, the file dialog could revert to the OS default if the configured project folder no longer exists (deleted, unmounted drive).
    • Fix: validate CARLA_KEY_MAIN_PROJECT_FOLDER with os.path.isdir; fall back to HOME.
    • Files: source/frontend/carla_host.py (slot_fileOpen)
    • Branch: bugfix/2026.03mar.29-file-open-default-folder
  • #2031 — Qt5 selected over Qt6 when both are present [easy]

    • Makefile.deps.mk set FRONTEND_TYPE = 6 first, then unconditionally overwrote it with FRONTEND_TYPE = 5 if Qt5 was also found — Qt5 always won on dual-Qt systems.
    • Fix: guard the Qt5 block with ifeq ($(FRONTEND_TYPE),) so it only runs when Qt6 was not selected. Qt5 standard support ended May 2025.
    • Files: source/Makefile.deps.mk
    • Branch: bugfix/2026.03mar.29-qt6-precedence-over-qt5
  • #1991make install aborts on missing VST2 glob [easy]

    • install -m 644 bin/CarlaRack*.* bin/CarlaPatchbay*.* fails with "cannot stat" when those files were not built (Linux without cross-compiled WIN32 VST2 binaries).
    • Fix: replace bare glob with a shell conditional that skips the install if no files match.
    • Files: Makefile (install_main target)
    • Branch: bugfix/2026.03mar.29-install-vst2-glob-guard
  • #1917 — FTBFS on GCC-14 [medium]

    • Build fails on GCC-14 (Ubuntu Oracular). Likely strict implicit-int or incompatible-pointer errors from deprecated GCC-14 behaviour. Build log at launchpad (gzipped).
    • Fix: fetch log, identify offending translation units, add -Wno-* guards or fix code.
    • Files: TBD after reading build log
    • Suggested branch: bugfix/YYYY.MMmon.DD-gcc14-build-errors

Patchbay / Canvas

Items ordered: canvas-size first (high impact, easy), then drag-scroll (UX), then sub-rack (hard).

  • #1481 — Canvas size not persisted; imported projects clip [easy]

    • When a project is loaded whose canvas boxes extend beyond the current scene rect, they are silently clipped or lost. The canvas has no persistence of its scene size.
    • Fix: in restoreGroupPositions, after setting all positions, call scene.setSceneRect with cur.united(scene.itemsBoundingRect()) if any item falls outside the current rect.
    • Files: source/frontend/patchcanvas/patchcanvas.py (restoreGroupPositions)
    • Branch: feature/2026.03mar.29-patchbay-canvas-autosize
  • #1577 — Patchbay: auto-scroll canvas during drag near edge [medium]

    • When dragging a rubberband selection, the canvas does not scroll when the cursor approaches the viewport edge.
    • Fix: in mouseMoveEvent, when m_mouse_rubberband is active, map scene pos to viewport coords; if within 30 px of any edge, step scroll bars proportionally.
    • Files: source/frontend/patchcanvas/scene.py (mouseMoveEvent)
    • Branch: feature/2026.03mar.29-patchbay-drag-scroll
  • #1353 — Display sub carla-rack plugin graph in patchbay [arch]

    • When a Carla-Rack is loaded as a plugin, expose its internal plugin graph as an expandable sub-graph in the parent patchbay — similar to REAPER's track wiring view.
    • Requires a recursive patchbay callback API (new PATCHBAY_CLIENT_TYPE_RACK_CHILD?), backend support for querying sub-rack plugin lists and their connections, and a new canvas group type or nested scene. Very large; requires coordination across the host/plugin boundary.
    • Files: backend API (CarlaBackend.h, CarlaEngine), patchcanvas, carla_host.py
    • Suggested branch: feature/YYYY.MMmon.DD-patchbay-rack-expansion

UI / Plugin Management

Items ordered: log missing URI, DSP refresh, minimised-plugin knobs, LV2 UI picker, embedded plugin UI tab (hard platform work).

  • #1499 — Log the URI/filename of missing plugin clients [easy]

    • When a project loads and a plugin cannot be found, the log only shows the client name.
    • Fix: added plugin type, binary path, and label/URI to the carla_stderr2 call in CarlaEngine::loadProject on load failure.
    • Files: source/backend/engine/CarlaEngine.cpp (project load path)
    • Branch: feature/2026.03mar.29-log-missing-plugin-uri
  • #1482 — Decouple DSP bar refresh rate from engine idle interval [easy]

    • CARLA_KEY_MAIN_REFRESH_INTERVAL controlled both fIdleTimerFast (engine idle) and fIdleTimerSlow (DSP bar + plugin slow idle). Slowing it for a calm DSP bar would break engine idle.
    • Fix: added CARLA_KEY_MAIN_DSP_REFRESH_INTERVAL (default 1000 ms) and a third timer fIdleTimerDsp driving getAndRefreshRuntimeInfo only. New spinbox in settings.
    • Files: source/frontend/carla_shared.py, source/frontend/carla_host.py, source/frontend/carla_settings.py, resources/ui/carla_settings.ui
    • Branch: feature/2026.03mar.29-dsp-bar-refresh-rate
  • #1923 — Show dry/wet and volume knobs on minimised plugin slots [medium]

    • Users with long racks keep most plugins minimised. Dry/wet and volume are the only controls they need but currently require expanding the slot.
    • The compact plugin UI (carla_plugin_compact.ui) does not contain knob widgets; adding them requires redesigning the compact UI, adding knob instances in the Python class, and wiring them to the existing parameter update path.
    • Files: resources/ui/carla_plugin_compact.ui, source/frontend/carla_skin.py (compact slot class), source/frontend/carla_widgets.py (parameter hooks)
    • Suggested branch: feature/YYYY.MMmon.DD-compact-slot-wet-vol-knobs
  • #1929 — Load a default session automatically on startup [medium]

    • Allow users to configure a default .carxp file that is loaded whenever Carla starts with no command-line project argument.
    • Fix: added CARLA_KEY_MAIN_DEFAULT_PROJECT to carla_shared.py; added file-picker row to the Paths settings group; on startup (not NSM, not isControl/isPlugin), if no CLI project and the key is set to a valid file, call loadProjectLater with it.
    • Files: source/frontend/carla_shared.py, source/frontend/carla_host.py, source/frontend/carla_settings.py, resources/ui/carla_settings.ui
    • Branch: feature/2026.03mar.30-default-session-on-open
  • #1559 — Per-plugin LV2 UI selector [medium]

    • CarlaPluginLV2 already enumerates all UIs in fRdfDescriptor->UIs and picks one automatically by priority (lines 7039–7157 in CarlaPluginLV2.cpp). There is no way for the user to override the selection.
    • Fix: expose the UI index as a per-plugin setting; add a "Choose UI…" entry to the plugin context menu; pass the chosen index to CarlaPluginLV2::ui_show, storing it in plugin state.
    • Files: source/backend/plugin/CarlaPluginLV2.cpp (UI selection, ui_show), source/frontend/carla_widgets.py or carla_skin.py (context menu)
    • Suggested branch: feature/YYYY.MMmon.DD-lv2-ui-selection
  • #1976 — LV2 scalePoints lost when bridge mode enabled [medium]

    • For some plugins, lv2:scalePoint entries are stripped when "Run plugins in bridge mode" is active. The bridge serialiser sends only the value range, discarding point labels.
    • Fix: trace the LV2 plugin info serialisation in the bridge path; ensure LV2_RDF_PortScalePoint array is included in the binary descriptor sent across the bridge pipe.
    • Files: source/backend/plugin/CarlaPluginLV2.cpp (bridge descriptor build), source/backend/utils/CarlaStateUtils.cpp or bridge pipe protocol
    • Suggested branch: bugfix/YYYY.MMmon.DD-lv2-bridge-scalepoints
  • #1523 — Option to embed plugin UIs as a tab inside Carla [hard]

    • Plugin UIs currently open as floating windows.
    • Requires XEmbed (X11) or Wayland foreign-toplevel; the bridge UI layer exists but embedding a native window into a QWidget tab differs significantly between X11 and Wayland.
    • Files: source/frontend/ (new tab widget), source/bridges-ui/CarlaBridgeUI.cpp, source/backend/plugin/CarlaPlugin.cpp
    • Suggested branch: feature/YYYY.MMmon.DD-embed-plugin-ui-tab

JACK / PipeWire

Items ordered: metadata icons (C++/Python, self-contained), PipeWire volumes (new API layer).

  • #1576 — Display JACK client metadata icons in patchbay [medium]

    • The JACK metadata API (jack_get_property / JACK_METADATA_ICON_SMALL) allows clients to advertise icon paths. Carla's patchbay could render these on canvas boxes.
    • Fix: query jack_get_property on client registration; pass icon path through patchbay callback to Python; render in canvasbox.py. Guard with #ifdef HAVE_JACK_METADATA.
    • Files: source/backend/engine/CarlaEngineJack.cpp, source/frontend/patchcanvas/canvasbox.py, source/frontend/carla_host.py (callback slot)
    • Suggested branch: feature/YYYY.MMmon.DD-jack-metadata-icons
  • #1927 — Auto-follow engine sample rate changes [medium]

    • When the JACK/PipeWire graph sample rate changes (e.g. switching between 48 kHz and 96 kHz in a DAW), Carla does not reconfigure automatically.
    • Fix: subscribe to the JACK JackSampleRateCallback in CarlaEngineJack.cpp; post a postponed event that triggers pData->engine->updateBufferSize / updateSampleRate; propagate to the frontend via ENGINE_CALLBACK_SAMPLE_RATE_CHANGED.
    • Files: source/backend/engine/CarlaEngineJack.cpp, possibly carla_host.py for UI update
    • Suggested branch: feature/YYYY.MMmon.DD-jack-follow-sample-rate
  • #1368 — Control PipeWire client volumes from patchbay [hard]

    • PipeWire assigns a volume control to every JACK client. Carla's patchbay could expose these as a gain slider or context-menu item.
    • JACK API has no volume concept; requires native PipeWire API (pw_core, pw_registry, SPA_PROP_channelVolumes). Guard with #ifdef HAVE_PIPEWIRE.
    • Files: new source/backend/engine/CarlaPipeWireHelper.cpp, CarlaEngineJack.cpp, patchcanvas context menu
    • Suggested branch: feature/YYYY.MMmon.DD-pipewire-client-volumes

Platform / Infrastructure

  • #1533 — WSL2 bridge for Linux plugins on Windows [arch]
    • Run Linux plugins on Windows by routing plugin IPC through a WSL2 instance. Entirely new infrastructure component; out of scope for a simple feature branch. Noted for completeness.

Meta / Non-code

  • #1888 — Parity and future of Carla vs mod-*

    • Architectural discussion issue. Not actionable as a code branch.
  • #1620 — Add GH issue templates to falktx/Carla

    • Repo governance task. Could be implemented on mxmilkiib/Carla fork independently (.github/ISSUE_TEMPLATE/) as a demonstration or personal convenience.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment