Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
151 commits
Select commit Hold shift + click to select a range
0a3ae28
Project: Moved the existing project to a FileBasedProject pimpl
drowaudio Feb 9, 2026
6576720
Merge branch 'develop' into featre/file_based_project
drowaudio Feb 9, 2026
ed961e8
Project: Added FolderBasedProject
drowaudio Feb 9, 2026
df38ac9
Project: Added some more tests
drowaudio Feb 9, 2026
6e2b9c1
Project: Added documentation
drowaudio Feb 9, 2026
1bd8e04
Project: Whitespace
drowaudio Feb 9, 2026
fed7a13
Project: Fixed juce module
drowaudio Feb 9, 2026
90d7770
Project: Added conversion from file to folder projects
drowaudio Feb 9, 2026
38da339
Project: Added properties for FolderBasedProject
drowaudio Feb 9, 2026
2d0574c
Project: Added ProjectManager tests
drowaudio Feb 9, 2026
89b0951
Project: Fixed test assumption
drowaudio Feb 9, 2026
db212b9
Project: Added docs
drowaudio Feb 9, 2026
14c829e
Project: Fixed a build warning
drowaudio Feb 9, 2026
bab1df2
Coverage: Added script to run coverage report locally (macOS & Linux)
drowaudio Feb 9, 2026
1a129a4
Project: Fixed a test set-up
drowaudio Feb 9, 2026
6440b93
Project: Avoided saving project_info if empty
drowaudio Feb 10, 2026
b6b1d97
Project: More tests and fixes
drowaudio Feb 10, 2026
2625656
Project: Added ProjectItemRef WIP
drowaudio Feb 12, 2026
8cbd659
Project: More conversions WIP
drowaudio Feb 13, 2026
fd55b34
Project: More transitions to ProjectItemRef
drowaudio Feb 13, 2026
b386c2b
Project: More cleanups
drowaudio Feb 13, 2026
7cf47bf
CMake: Added the option to include targets as part of another projec…
drowaudio Feb 10, 2026
fdc5920
Project: Removed lots of direct uses of ProjectItemID
drowaudio Feb 13, 2026
4b23c19
Project: Added docs/Folder_Based_Projects.md
drowaudio Feb 13, 2026
66e2850
Project: Fixed an issue with absolute paths
drowaudio Feb 13, 2026
2f0fc29
Project: Removed the ProjectSearchIndex and SearchOperation classes…
drowaudio Feb 13, 2026
438f257
Project: More API improvements
drowaudio Feb 16, 2026
7391052
Project: Fixed ProjectItem::setSourceFile
drowaudio Feb 16, 2026
925e420
Tests: Added filtering of the test runner app
drowaudio Feb 16, 2026
8efd816
Project: Updated juce
drowaudio Feb 18, 2026
6c7eb3c
Merge branch 'develop' into feature/file_based_project
drowaudio Feb 18, 2026
0f94b51
UI: Removed the antiquated yieldGUIThread
drowaudio Feb 19, 2026
39461a5
Project: Fixed get/setDescription
drowaudio Feb 19, 2026
f34f4fe
Project: Added ProjectUtilitiesfor edit/project consolidation
drowaudio Feb 19, 2026
1502298
Project: Updated namespace styles
drowaudio Feb 19, 2026
182ce88
Project: Updated choc
drowaudio Feb 19, 2026
1ea40fd
Examples: Updated min deployment target to 10.15
drowaudio Feb 20, 2026
c227809
Project: Refactored archiving to convert to folder based projects f…
drowaudio Feb 20, 2026
2475be6
Project: Added progress to file copy stage of archive
drowaudio Feb 20, 2026
5ffb28f
Project: Convert archive to choc::ZipFile
drowaudio Feb 20, 2026
f9de1a6
Project: Fixed a couple of problems with archiving
drowaudio Feb 20, 2026
c4e08e4
Project: Excluded legacy files from tests
drowaudio Feb 20, 2026
c9a419e
Project: Fixed a build error
drowaudio Feb 20, 2026
1689755
Project: Safety fixes
drowaudio Feb 20, 2026
f167c6a
Project: Thread-safety fixes
drowaudio Feb 20, 2026
9d130ec
Project: Minor style fixes
drowaudio Feb 20, 2026
79f3461
CI: Updated coverage action/token
drowaudio Feb 20, 2026
2607e2a
Project: Updated codecov to ignore legacy archive files
drowaudio Feb 21, 2026
f006572
Project: Updated choc
drowaudio Feb 21, 2026
dc78424
Project: Updated docs
drowaudio Feb 23, 2026
93fd0e0
Project: Added a claude command
drowaudio Feb 23, 2026
56e9421
Project: Added more tests
drowaudio Feb 23, 2026
6cd3bef
Project: Fixed a Windows path error
drowaudio Feb 23, 2026
0368b12
Automation curve improvements to allow copy/paste of multiple curves …
julianstorer Feb 23, 2026
f9a4e10
Fixes for inserting space into the edit. This operation failed to upd…
julianstorer Feb 24, 2026
268afd4
Similar fixes and tests for space deletion (see the previous commit f…
julianstorer Feb 24, 2026
5d10442
ARA: Added looping and the start of iXML ARA chunks
drowaudio Feb 24, 2026
6efa37c
ARA: Worked around a ssize_t issue
drowaudio Feb 24, 2026
0c19b4d
Rephrased some code to avoid a compiler warning in android
julianstorer Feb 25, 2026
f1f83eb
ARA: More work on iXML restoring
drowaudio Feb 25, 2026
f5f26f5
Project: Added isTracktionProjectFolder and isTracktionProjectFileO…
drowaudio Feb 26, 2026
69c4707
Project: Ensured project files/folders are freed in unlockFile
drowaudio Feb 26, 2026
cd22ba9
Core: Added a is_any_of function
drowaudio Feb 26, 2026
1e1a7d2
Multichannel: Refactored InputDevice and OutputDevice to have a commo…
julianstorer May 19, 2025
0dba8f3
Multichannel: Refactored the way that audio channel groupings are han…
julianstorer May 16, 2025
4c2ef2b
Multichannel: Some changes to device name/alias getter and setters
julianstorer May 20, 2025
11562fd
Multichannel: Created ChannelConfiguration class and refactored exist…
julianstorer Jan 21, 2026
67f85bc
Multichannel: Changed AudioClipBase to support arbitrary channel counts
julianstorer Jan 21, 2026
fd73c0b
Multichannel: More refactoring towards multichannel support
julianstorer Jan 26, 2026
12a30df
Multichannel: WIP allowing devices to use more channels
julianstorer Feb 4, 2026
faf2d12
Multichannel: Fixed some include paths and demo code
julianstorer Feb 24, 2026
3ea9305
ARA: Added head/tail times to Clip and ARA
drowaudio Feb 27, 2026
3cee299
DAWproject: Fixed timebase of clip durations
drowaudio Feb 27, 2026
f14d214
UI: Made bi-polar automation curves display from the centre
drowaudio Feb 27, 2026
51dd763
ClipEffects: Fixed mono files to stereo conversion
drowaudio Feb 27, 2026
ffc696d
Merge branch 'feature/file_based_project' of github.com:Tracktion/tra…
drowaudio Feb 27, 2026
80fc362
Multichannel: refactored how AudioClip gets/sets its channel config
julianstorer Feb 27, 2026
aecd089
Multichannel: refactored AudioFileCache to use the new ChannelConfigu…
julianstorer Feb 27, 2026
4c51807
Updated a test
julianstorer Feb 28, 2026
38cb2b5
Bugfix: fixed a race condition where pitch-shifted clips using proxie…
julianstorer Mar 2, 2026
aa61c5e
Tweaked the smoothing on the volume/pan parameters to make them tighter
julianstorer Mar 3, 2026
3df16f8
ARA: Fixed an issue where a track could be deleted before an ARA clip
drowaudio Mar 3, 2026
e2a7120
ARA: Refactored and renamed some IDs
drowaudio Mar 4, 2026
1b0122f
Audio: Implemented FolderBasedProject::removeProjectItem to fix pro…
drowaudio Mar 4, 2026
661036b
Project: fixes for loading edits on startup from folder-based project…
julianstorer Mar 4, 2026
0cc2b98
Merge branch 'feature/file_based_project' of github.com:Tracktion/tra…
drowaudio Mar 4, 2026
f8beccf
ARA: Refactored copy/paste and added some extra logging
drowaudio Mar 5, 2026
05f0475
ARA: Added a horrendously complicated backwards compatibility step
drowaudio Mar 5, 2026
5c2a48d
Audio Comps: Updated to use paths as well as ProjectItemIDs
drowaudio Mar 6, 2026
f62cbd6
Audio: Fixed WaveAudioClip::setCurrentTake to use ProjectItemRef in…
drowaudio Mar 6, 2026
2c5d42c
Audio: Added folder-based project test coverage for CompManager
drowaudio Mar 6, 2026
1be0aab
Multichannel: Simplified channel group menu to show practical channel…
julianstorer Mar 6, 2026
19c505e
Multichannel: allowed > 2 channels for recording
julianstorer Mar 5, 2026
d644566
Multichannel: Added channel layout metadata round-trip to AudioFileInfo
julianstorer Mar 5, 2026
9c8b666
Multichannel: Multichannel routing and increasing level meter capacity
julianstorer Mar 6, 2026
2714576
Fixed MSVC ambiguous conversion in copyPropertiesToCachedValues
julianstorer Mar 6, 2026
666a6d4
Suppressed a warning in the airwindows code
julianstorer Mar 9, 2026
6b79ca3
ARA: Fixed closing of ARA windows when a clip is deleted
drowaudio Mar 8, 2026
56958da
Project: Avoided trying to render proxies and source files when ope…
drowaudio Mar 9, 2026
9e89668
ClipEffects: Added some copy/paste tests
drowaudio Mar 9, 2026
cd9b792
Added musical note annotations to quantise menus
julianstorer Mar 11, 2026
d377c84
Project: Added various utilities for better handling of audio source …
julianstorer Mar 11, 2026
fe0526d
Multichannel: auto-widening between mono <-> stereo
julianstorer Mar 12, 2026
ef840b2
Multichannel: Allowed tracks to have "none" set at their output, so t…
julianstorer Mar 16, 2026
ac76d5e
Multichannel: making racks multichannel-capable
julianstorer Mar 16, 2026
6cc4b28
Multichannel: fix for stereo -> mono levels, plus added/fixed more tests
julianstorer Mar 17, 2026
35fa7cd
Avoided an assertion when moving clips with automation lock
julianstorer Mar 17, 2026
ba34c41
Multichannel: fix for send node insertion
julianstorer Mar 17, 2026
e504d73
Added an optional custom name for plugins
julianstorer Mar 17, 2026
0e24640
Fix for automation lock not working on macro parameters
julianstorer Mar 17, 2026
81ff11e
Fixed a failing test
julianstorer Mar 17, 2026
16a432c
More capable algorithm for making a good choice about whether a clip …
julianstorer Mar 18, 2026
0aa3cdb
Added support for the signalsmith time stretcher
julianstorer Mar 18, 2026
ed3b452
Tweaked the relative path detection algorithm to be a bit more lenien…
julianstorer Mar 19, 2026
77a1ee9
Fixed an MSVC warning
julianstorer Mar 19, 2026
032a195
Project: Fix source file path resolution for copied projects and arch…
julianstorer Mar 19, 2026
b73b851
Updated the readme
julianstorer Mar 19, 2026
f7012a3
Added a feature to AudioFileManager to allow clients to register a ch…
julianstorer Mar 19, 2026
b784e2a
Renamed poorly-named class FallbackReader -> AudioFormatReaderWithTim…
julianstorer Mar 19, 2026
640234b
Made a rendering test more robust when there is latency
julianstorer Mar 19, 2026
0f00acb
Racks: Add separate input/output channel counts to RackInstance
julianstorer Mar 20, 2026
90d693e
Project: Updated some variable names
drowaudio Mar 19, 2026
f0964b0
EditClip: Fixed up more path related issues and ensured Edit clips …
drowaudio Mar 20, 2026
9235961
Multichannel: Changes to the Plugin and ExternalPlugin class to provi…
julianstorer Mar 20, 2026
62cf076
Updates for latest juce
drowaudio Mar 20, 2026
1fef403
Updated juce
drowaudio Mar 20, 2026
40249d6
TimeStretch: Suppressed GCC -Wclass-memaccess warning in signalsmit…
drowaudio Mar 20, 2026
c1598d1
Added a missing override to avoid a warning
julianstorer Mar 21, 2026
d5301e2
Fixed a TimeStretchReader test that had an off-by-one error
julianstorer Mar 21, 2026
061727a
Multichannel: updated the renderer to take arbitrary channel layouts
julianstorer Mar 23, 2026
289bb61
Multichannel: More control over arbitrary channel ordering
julianstorer Mar 24, 2026
bbdcc40
Added some explicit casts to keep the latest clang version happy
julianstorer Mar 25, 2026
3883074
Some optimisations for the overhead of calls into a plugin. Added a c…
julianstorer Mar 26, 2026
7b70db1
Optimisation to the level meters: it was acquiring 3 spinlocks per ch…
julianstorer Mar 26, 2026
38999de
Multichannel: clip effects output config, source file metadata, freez…
julianstorer Mar 27, 2026
539f159
Multichannel: made getMainBusInputChannelConfiguration pure virtual, …
julianstorer Mar 27, 2026
bbf76e7
Added some more multichannel tests. Fixed an unused variable.
julianstorer Mar 28, 2026
37bc52c
Projects: Avoided translating folder names
drowaudio Mar 30, 2026
29887e5
Replaced a batch of direct JUCE modal calls with async UIBehaviour me…
julianstorer Mar 30, 2026
b3056b7
Another batch of modal cleanups, removing some old defunct code, and …
julianstorer Mar 30, 2026
fb293b4
Converted another big batch of modal loops to async code
julianstorer Mar 31, 2026
9ad2f0a
Clipboard: Fixed an issue copy/pasting files across projects
drowaudio Mar 31, 2026
0e8c95a
Examples: Replace deprecated setStereoPair with setChannelConfigura…
drowaudio Apr 1, 2026
c9867f4
Warnings: Fixed some more warnings
drowaudio Apr 1, 2026
1844b68
Warnings: Another warning fix
drowaudio Apr 1, 2026
1df2ad9
Build: Suppress JUCE module warnings in tracktion_engine example ta…
drowaudio Apr 1, 2026
1145d94
Audio: Fix discrete channel type round-trip in ChannelConfiguration…
drowaudio Apr 1, 2026
4f17810
Multichannel: fixed a test and some channel conversion logic
julianstorer Apr 1, 2026
32ba3f8
Multichannel: more test updates
julianstorer Apr 1, 2026
960df02
Coverage: Added the TestPropertyStorage to avoid loading state from…
drowaudio Apr 2, 2026
c73bfb6
Updated juce
drowaudio Apr 2, 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
  •  
  •  
  •  
29 changes: 29 additions & 0 deletions .claude/commands/improve-pr-coverage.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Improve test coverage for this PR's changed code.

Follow these steps in order:

1. **Identify PR scope:** Run `git diff main...HEAD --name-only` to find all files changed in this branch. These are the only files you should care about. Exclude anything in the `legacy` namespace entirely.

2. **Understand what changed:** Read the changed files and build a mental model of the new/modified features, public APIs, branching logic, and edge cases introduced by this PR.

3. **Run coverage baseline:** Build and run the coverage tool in `tests/coverage` to generate a report. Parse the output to extract per-file and per-function coverage percentages for the changed files only.

4. **Prioritize gaps:** From the changed files, rank uncovered or under-covered areas by size and importance:
- Prefer covering entire uncovered functions/methods over chasing individual branch misses
- Prefer public API surface over internal helpers
- Prefer complex branching logic and error handling over straight-line code
- Skip trivial getters/setters and boilerplate

5. **Write tests:** Add or extend tests targeting the largest coverage gaps first. For each test:
- Place it in the appropriate existing test file/directory following the project's conventions
- Name it descriptively for what behavior it verifies
- Cover the happy path, then key error/edge cases
- Stop working on a file once it reaches ~85% coverage — do not chase 100%

6. **Verify:** Re-run the coverage tool after writing tests. Confirm that the changed files are at or near 85%. If any file is still significantly below, do another pass on the biggest remaining gap only.

**Constraints:**
- Do NOT modify any source code — only add/edit test files
- Do NOT touch or add tests for anything in the `legacy` namespace
- Do NOT add tests for code outside the PR's changed files
- Target 85% coverage on changed files, not the whole repo
2 changes: 2 additions & 0 deletions .codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ ignore:
- "modules/tracktion_core/3rd_party"
- "modules/tracktion_graph/3rd_party"
- "modules/tracktion_engine/3rd_party"
- "**/tracktion_ArchiveFile.*"
- "**/tracktion_ExportJob.*"
8 changes: 5 additions & 3 deletions .github/workflows/generate_coverage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,9 @@ jobs:
--exclude "modules/3rd_party/*" \
--exclude "/Applications*" \
--exclude "/usr*" \
--exclude "*examples*"
--exclude "*examples*" \
--exclude "*/tracktion_ArchiveFile.*" \
--exclude "*/tracktion_ExportJob.*"

# - name: macOS coverage
# if: runner.os == 'macOS'
Expand Down Expand Up @@ -107,7 +109,7 @@ jobs:

- name: Upload Linux coverage to Codecov
if: runner.os == 'Linux'
uses: codecov/codecov-action@v4
uses: codecov/codecov-action@v5
with:
files: ./tests/coverage/build/coverage.info
token: ${{ secrets.CODECOV_TOKEN_V4 }}
token: ${{ secrets.CODECOV_TOKEN_V5 }}
126 changes: 126 additions & 0 deletions BREAKING-CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,132 @@

___

### Change
`TracktionArchiveFile` and `ExportJob` moved to `legacy::` namespace.

#### Possible Issues
Code using `TracktionArchiveFile` or `ExportJob` directly will no longer compile.

#### Workaround
Qualify with `legacy::` (e.g. `legacy::TracktionArchiveFile`). For new code, use `ArchiveJob` instead, which produces standard zip files. Use `isArchive()` and `isLegacyArchive()` to detect archive formats.

#### Rationale
The legacy `.trkarch` format is replaced by standard zip archives. The old classes are preserved in a `legacy::` namespace for reading existing archives.

___

### Change
`ProjectSearchIndex`, `SearchOperation`, and related APIs have been removed.

#### Possible Issues
Code using `ProjectSearchIndex`, `SearchOperation`, `createSearchForKeywords()`, or `Project::searchFor()` will no longer compile. The header `tracktion_ProjectSearchIndex.h` has been deleted.

#### Workaround
Use plain string matching or Levenshtein distance on project item names/descriptions.

#### Rationale
The search infrastructure was tightly coupled to file-based project internals and not applicable to folder-based projects. Simpler alternatives are sufficient.

___

### Change
`Edit::createEditForExamining(Engine&, ValueTree, EditRole, LoadContext*)` overload is now `[[deprecated]]`.

#### Possible Issues
Deprecation warnings when calling this overload.

#### Workaround
Use `loadEditForExamining(ProjectManager&, ProjectItemRef)` instead.

#### Rationale
The new function works with both file-based and folder-based projects and handles source resolution correctly.

___

### Change
`Project::getAllItemIDs()` has been removed.

#### Possible Issues
Code that calls `getAllItemIDs()` will no longer compile.

#### Workaround
Use `getAllProjectItemRefs()` instead to iterate over project items.

#### Rationale
The method was unused and redundant with `getAllProjectItemRefs()`.

___

### Change
`ProjectItemRef::getProjectItemID()` now returns `std::optional<ProjectItemID>` instead of a bare `ProjectItemID`.

#### Possible Issues
Code that chains method calls on the return value (e.g. `.isValid()`, `.getProjectID()`, `.getRawID()`) will no longer compile.

#### Workaround
Use `has_value()` or bool conversion instead of `.isValid()`. Use `->` to access members when the optional is known to contain a value (e.g. `pid->getProjectID()`). Use `*` to extract the value when passing to functions that expect `ProjectItemID`.

#### Rationale
Returning `std::optional` makes the fallibility explicit at the type level, preventing accidental use of an invalid `ProjectItemID`.

___

### Change
`Project::getProjectID()` now returns `ProjectID` instead of `int`. `ProjectItemID` constructors and `createNewID` take `ProjectID` instead of `int`. `ProjectManager::getProject()` takes `ProjectID` instead of `int`.

#### Possible Issues
Code that stores or passes project IDs as raw `int` values will no longer compile.

#### Workaround
Wrap raw ints with `ProjectID(myInt)` and extract with `.toInt()`. For example: `ProjectID pid = project.getProjectID();` instead of `int pid = project.getProjectID();`.

#### Rationale
A strong type prevents accidental misuse of raw integers as project identifiers and makes the API self-documenting.

___

### Change
`ProjectItemRef` replaces raw `ProjectItemID` in many APIs. `Project::getProjectItemRef()`, `getProjectItemFor()`, `removeProjectItem()`, and `getIndexOf()` now use `ProjectItemRef`. `ProjectItem::getProjectItemRef()` returns `const ProjectItemRef&`. `ProjectManager::getProjectItem()` and `findSourceFile()` have new `ProjectItemRef` overloads.

#### Possible Issues
Code that explicitly types return values as `ProjectItemID` from these methods will no longer compile.

#### Workaround
`ProjectItemRef` has an implicit constructor from `ProjectItemID`, so most call sites compile unchanged. For return values, use `auto` or `ProjectItemRef`. If you need the old type, call `.getProjectItemID()` on the ref after checking `isProjectItemID()`.

#### Rationale
`ProjectItemRef` supports both ID-based references (file-based projects) and path-based references (folder-based projects) in a single type.

___

### Change
`ProjectManager::createNewProject`, `createNewProjectInteractively`, `createNewProjectFromTemplate`, and the `TempProject` constructor now accept a `ProjectType` parameter (`ProjectType::fileBased` or `ProjectType::folderBased`).

#### Possible Issues
None for existing code — the parameter defaults to `ProjectType::fileBased`.

#### Workaround
No changes required. Pass `ProjectType::folderBased` to create folder-based projects.

#### Rationale
Enables creation of folder-based projects through the existing project creation APIs.

___

### Change
`Project::findOrphanItems()` has been deprecated in favour of `findOrphanItemRefs()`.

#### Possible Issues
Deprecation warnings when calling `findOrphanItems()`.

#### Workaround
Replace `findOrphanItems()` with `findOrphanItemRefs()`, which returns `juce::Array<ProjectItemRef>` instead of `juce::Array<ProjectItem::Ptr>`.

#### Rationale
The new method returns `ProjectItemRef` values that work with both file-based and folder-based project backends.

___

### Change
`AudioClipBase::melodyneProxy` public member has been removed. Use the new `getARAProxy()` accessor instead.

Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,3 +104,4 @@ Tracktion Engine utilises and contains copies of the following libraries. Please
- [magic_enum](https://www.github.com/Neargye/magic_enum) - MIT
- [farbot](https://www.github.com/hogliux/farbot) - MIT
- [doctest](https://www.github.com/doctest/doctest) - MIT
- [signalsmith-stretch](https://www.github.com/Signalsmith-Audio/signalsmith-stretch) - MIT
Loading
Loading