Commit Graph
839 Commits
Author SHA1 Message Date
Brandon ThomasandClaude Opus 5.5 baea184bd1 Keep one VST3 controller-sync path after merging #306's latest
The landing branch already syncs host-set values to the controller before
saving state (lock-free atomics + EditorLink::sync_param); the PR's later
ControllerPending table did the same, so keep one. Keeps the PR's new
'a loaded state replaces earlier edits' assertion, which passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 06:26:54 -04:00
Brandon Thomas 1dcd6aa064 Merge #322's latest into the landing branch 2026-10-13 06:25:57 -04:00
Brandon Thomas 94390f49fa Merge #319's latest into the landing branch 2026-10-13 06:25:57 -04:00
Brandon Thomas 20927d7684 Merge #315's latest into the landing branch 2026-10-13 06:25:56 -04:00
Brandon Thomas 35ba903358 Merge #338's latest into the landing branch 2026-10-13 06:25:56 -04:00
Brandon Thomas 8b78e0306b Merge #332's latest into the landing branch 2026-10-13 06:25:56 -04:00
Brandon Thomas f29b4ef325 Merge #296's latest into the landing branch 2026-10-13 06:25:56 -04:00
Brandon Thomas bd5b5f17fa Merge #209's latest into the landing branch 2026-10-13 06:25:56 -04:00
Brandon Thomas 03815fbf4d Merge #360's latest into the landing branch 2026-10-13 06:25:56 -04:00
Brandon Thomas 19b1f33eb5 Merge #384's latest into the landing branch 2026-10-13 06:25:56 -04:00
Brandon Thomas 9b362a7244 Merge #365's latest into the landing branch 2026-10-13 06:25:56 -04:00
Brandon Thomas 0dc7b1ebec Merge #393's latest into the landing branch 2026-10-13 06:25:56 -04:00
Brandon Thomas 0c30ecffcc Merge #367's latest into the landing branch 2026-10-13 06:25:56 -04:00
Brandon Thomas 7a6df4cbbd Merge #306's latest into the landing branch 2026-10-13 06:25:56 -04:00
Brandon Thomas d434cf6b15 Merge #369's latest into the landing branch 2026-10-13 06:25:55 -04:00
Brandon Thomas c2f052715d Merge main into #319 2026-10-13 06:16:54 -04:00
Brandon Thomas edd1787353 Merge main into #322 2026-10-13 06:13:17 -04:00
Brandon Thomas ec8d1ed6a8 Merge #322 2026-10-13 06:13:17 -04:00
Brandon ThomasandClaude Opus 5.5 bec0cca48d Fix build after merging main into #334
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 06:12:51 -04:00
Brandon Thomas b2e4dee0dd Merge #334 2026-10-13 06:12:51 -04:00
Brandon Thomas 00faedcbd0 Merge main into #334 2026-10-13 06:09:17 -04:00
Brandon Thomas b0daf3213e Merge main into #315 2026-10-13 06:08:18 -04:00
Brandon Thomas 5323c8ef25 Merge #315 2026-10-13 06:08:18 -04:00
grovebit 67c51ef198 Merge origin/main into corrupt-sessions
#309 and this branch both added io::read_file and read_text. There is
one of each now: read_file checks the automation read root (#309), then
refuses anything but a regular file (this branch), and read_text is
read_file as UTF-8. Opening a session keeps #309's explicit read-root
check, so a refused path is reported with its reason, then decodes
through this branch's decode_file. The clip group importer and
decode_file take their de-duplication key from a new io::file_key,
since #309's test keeps std::fs calls inside io.rs. Session saves use
#309's make_dir. Import Session Data keeps decoding through
decode_file, so the load_source that #309 had switched to read_file
stays removed.
2026-10-13 11:08:01 +01:00
grovebit 2895fa7dd0 Merge origin/main into plugin-transport-midi
#304's MIDI Track Offset shifts the block schedule_notes reads, which
now carries this branch's controllers too. chase_controllers takes the
same offset, so a seek chases the controller values in effect where the
offset puts the track, not at the raw transport position. New test: with
the track 0.5 s late, starting at 1.25 s chases the sustain pedal still
down (without the offset it sent the pedal-up that only plays at 1.5 s).

Also: reset() sets the chase flag beside #301's alignment flush, the
VST3 Instance keeps #400's set_normalized beside midi_mapping, and the
mix tests keep #210's Keys plugin beside this branch's Clock and Ears.
2026-10-13 11:06:09 +01:00
Brandon Thomas 5686d61f45 Merge main into #390 2026-10-13 06:04:00 -04:00
Brandon Thomas bee60a375c Merge #390 2026-10-13 06:04:00 -04:00
grovebit 221661a46a Merge origin/main into edit-modes
Timecode::to_frames takes main's i128 version (#260), which already
covers the overflow this branch guarded with saturating arithmetic.
The Spot dialog formats and parses through Session::format_position
and parse_position, so it also gets #294's feet+frames start. Nudge
keeps #363's `next` parameter beside this branch's Edit Mode, Snap to
Grid and Shuffle Lock commands. The mode tooltips use main's `fkey`.
2026-10-13 11:03:29 +01:00
grovebit 7ec362962c Merge origin/main into session-copies
Main's track rows (#382 tint, #383 headers, #359 grid over clips) take
this branch's borrowed track and shared session snapshot. The ruler
labels use main's format_position with the feet+frames start, but keep
the frame rate timebase_ruler is given, so the second timecode ruler
still shows its own rate without a session copy.
2026-10-13 11:03:01 +01:00
grovebit dd57e2a9e6 Merge origin/main into bounce-streaming
#309 confines file writes to the automation write root: make_dir,
write_path and replace_file now check every path first. This branch
bounces through Bounce, which streams to a .part file and renames it
over the target, so Bounce::new now checks both paths before it creates
the part file. That covers Bounce Mix, bus bounces and stems, which
main writes through write_file and write_path. Stems keep the 4-hour
limit and use make_dir. replace_file keeps #309's checks in front of
this branch's replace_with. automation_roots' bounce cases pass.
2026-10-13 11:01:51 +01:00
Brandon Thomas 82eff0f561 Merge main into #219 2026-10-13 06:01:05 -04:00
Brandon Thomas a16bb01915 Merge #219 2026-10-13 06:01:05 -04:00
Brandon ThomasandClaude Opus 5.5 6409a8cbbd Fix build after merging main into #335
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 06:00:30 -04:00
Brandon Thomas 6583ec6032 Merge #335 2026-10-13 06:00:30 -04:00
grovebit 776a7af06c Merge origin/main into plugin-safety
#400 (fixes #257) made Vst3Plugin::save_state tell the edit controller
the values the host set before taking the snapshot. This branch reads
plugin state on the UI thread through EditorLink instead, and removes
Vst3Plugin::save_state, so keeping its side of that conflict would have
dropped the fix.

The values now wait in a ControllerPending table shared by the instance
and its EditorLink: one AtomicU64 slot per parameter, which set_param
fills on the audio thread without locking or allocating.
EditorLink::save_state sends the waiting values with setParamNormalized
under its lock, before it reads the controller's state. A state load
clears them, as #400's refresh did. Instance::set_normalized, which only
the old save_state used, is gone. #400's round-trip test passes, plus a
check that a loaded state replaces earlier host edits.

#327's a_new_instance_replaces_a_matching_one_in_its_slot told the two
instances apart through MixEngine::capture_states, which this branch
removes (states are read on the UI thread). The two instances now
differ in gain instead (-6 and -20 dB), and the test checks that the new
level plays and that the old instance is retired.

Also: Side::new sets #210's old_sessions field.
2026-10-13 10:58:07 +01:00
grovebit 46bef836a3 Merge remote-tracking branch 'origin/main' into controls-look
# Conflicts:
#	crates/ui-egui/src/mix_window.rs
#	crates/ui-egui/src/widgets.rs
2026-10-13 10:56:01 +01:00
grovebit 1d562bb009 Merge remote-tracking branch 'origin/main' into menu-search
# Conflicts:
#	crates/ui-egui/src/edit_window.rs
#	crates/ui-egui/src/mix_window.rs
2026-10-13 10:56:01 +01:00
grovebit 2094c7fbd2 Merge remote-tracking branch 'origin/main' into track-height-drag
# Conflicts:
#	crates/engine/src/cmd/track.rs
#	crates/ui-egui/src/edit_window.rs
#	crates/ui-egui/src/shortcuts.rs
2026-10-13 10:56:01 +01:00
Brandon Thomas e0deb3f4e5 Merge main into #335 2026-10-13 05:55:06 -04:00
Brandon Thomas bae80849dd Merge main into #338 2026-10-13 05:51:51 -04:00
Brandon Thomas 4fcc387571 Merge #338 2026-10-13 05:51:51 -04:00
Mikkel konyher bca2b4af07 Drag across checkboxes to check or uncheck several (#399)
Press a checkbox and drag over its neighbours: each box the pointer
passes takes the state the first one switched to, until the button is
released. A click toggles one box, as before. Same design as VectorCraft
and PhotoCraft.

widgets::checkbox wraps egui's checkbox and adds the drag; every
ui.checkbox call in ui-egui uses it. Only boxes the pointer can see are
set, so rows scrolled out of a list or under another window stay as
they are.

Tests: widgets::tests (drag sets, drag unchecks and stops at release,
hidden rows untouched, a click toggles one) and tests/group_dialog.rs
(dragging down the Group dialog's track list groups every track).
2026-10-13 11:51:48 +02:00
grovebit 41f6670889 Merge remote-tracking branch 'origin/main' into new-midi-clip
# Conflicts:
#	crates/engine/src/cmd/edit.rs
2026-10-13 10:51:30 +01:00
grovebit 338411b99a Merge remote-tracking branch 'origin/main' into zoom-toggle
# Conflicts:
#	crates/model/src/lib.rs
2026-10-13 10:51:29 +01:00
grovebit fd1348f1b3 Merge remote-tracking branch 'origin/main' into live-take-waveform
# Conflicts:
#	crates/ui-egui/src/edit_window.rs
2026-10-13 10:51:29 +01:00
Limestudio90andClaude Opus 5.5 3b7a1f2b33 ROADMAP: no blank line inside the progress log (rebase leftover)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 11:47:49 +02:00
Limestudio90andClaude Opus 5.5 6d910609e1 Docs: Mix in a separate window
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 11:47:42 +02:00
Limestudio90andClaude Opus 5.5 ea531b723f Mix in a separate window: Edit and Mix on screen at once
Window > Mix in Separate Window (window.mix_separate, kept with the UI
preferences) shows the Mix window in its own native window through an
egui immediate viewport, so Edit and Mix can be seen at once, e.g. one
per monitor. The main window then keeps Edit; Window > Mix and
Cmd/Ctrl+= bring the Mix window to the front; closing it puts Mix back
into the main window. Backends without multiple windows show it as a
floating egui window.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 11:47:42 +02:00
Limestudio90andClaude Opus 5.5 0e6f5accb4 ROADMAP: no blank line inside the progress log (rebase leftover)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 11:47:30 +02:00
Limestudio90andClaude Opus 5.5 d8b2961651 Close plugin editors before reopening the audio device
Applying new audio device settings replaced the player while plugin
editor windows were open: the old instances went away with it (possibly
on the audio thread, where windows cannot be closed) and their editor
windows stayed on screen orphaned. Player::close_editors closes them on
the main thread first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 11:46:55 +02:00