Commit Graph
24 Commits
Author SHA1 Message Date
Brandon ThomasandClaude Opus 5.5 3a3c447904 Merge origin/main into issue-57
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:30:26 -04:00
Brandon ThomasandClaude Opus 5.5 7f258b28a7 Merge origin/main into issue-50
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:26:37 -04:00
Brandon Thomas 6ff36097d9 Merge pull request #51 from MarekSpodBiedry/issue-48
soundcraft-cli --help: stop at the closing code fence, no Rust source lines (#48)
2026-10-09 20:25:43 -04:00
Brandon Thomas 5f2ce943a6 Merge pull request #10 from reoniazx/fix/macos-native-menu-bar
macOS: move application menus to the system menu bar
2026-10-09 18:27:25 -04:00
Brandon Thomas 03972e20ca Merge pull request #34 from DWAA1660/fix/windows-dx12-startup
Default Windows startup to DirectX 12
2026-10-09 18:27:19 -04:00
Brandon ThomasandClaude Opus 5.5 acf3237bed Merge origin/main into fix/macos-native-menu-bar
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:15:50 -04:00
Brandon ThomasandClaude Opus 5.5 6e55d9e04f Merge origin/main into fix/windows-dx12-startup
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:15:02 -04:00
Brandon ThomasandClaude Opus 5.5 2e2220c64d Merge origin/main into fix/vst3-module-exit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:13:17 -04:00
Brandon ThomasandClaude Opus 5.5 5824042856 Merge origin/main into desktop-log-file
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:12:03 -04:00
MarekSpodBiedry f8a156d255 Warn about missing media when opening a session (#57) 2026-10-09 20:28:46 +02:00
MarekSpodBiedry 258c63930e CLI: run --cmd and app reject malformed JSON instead of using empty params (#50) 2026-10-09 19:29:46 +02:00
MarekSpodBiedry ff564ea4f0 soundcraft-cli --help: stop at the closing code fence, no Rust source lines (#48) 2026-10-09 19:29:29 +02:00
tandClaude Opus 5.5 dd52eb7dad macOS menu bar: fall back instead of failing to start; throttle sync
- A muda error now logs a warning and keeps the in-window menu bar
  instead of aborting startup (never crash).
- sync() walked ~500 leaves with a command lookup and a Cocoa call each
  frame; run it at most 4x/s and right after a click.
- About / Session Info from the application menu open their window
  rather than toggling it closed.
- The title carries Edit/Mix and the dirty mark only when the system
  menu bar replaces the egui one (no duplicate on Linux/Windows).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 11:12:12 -04:00
Ahmed Moussa b63a13925b fix(Play Audio): Resume the web AudioContext on the first user gesture
cpal (wasm) creates its output stream at startup, before any user gesture, so the browser leaves the WebAudio AudioContext 'suspended'. As a result no audio plays, and the transport clock never advances because the audio callback drives it.

Wrap the AudioContext constructor before the wasm module loads so that every context cpal creates is captured. On the first pointer, mouse, touch or key event, resume any context that is still suspended.

Signed-off-by: Ahmed Moussa <moussa.ahmed95@gmail.com>
2026-10-09 13:07:37 +03:00
DWAA1660andClaude Opus 5.5 c25a873d3f Default Windows startup to DirectX 12
eframe's default wgpu instance enables PRIMARY | GL on Windows. Creating
the OpenGL backend can crash inside AMD's atio6axx.dll before the window
appears, so the app exits silently at launch. When WGPU_BACKEND is not
set, the Windows instance now enables only DirectX 12; an explicit
WGPU_BACKEND is still honoured. macOS, Linux and web are unchanged.

Same fix as storytold/designcraft#168 and storytold/filmcraft#179.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LyVbT6Vv4BwWZ4hY8973qD
2026-10-08 18:58:22 -06:00
ebbicottandClaude Opus 5.5 ae2362752c Shut plugin hosting down in on_exit: ⌘Q exits from inside the event loop
The system Quit (⌘Q, or a quit Apple Event) goes through
-[NSApplication terminate:], which calls exit() from inside the event loop, so
eframe::run_native never returns and the shutdown placed after it never ran.
With HALion Sonic in use, the exit handler then ran its bundleExit too late and
the app crashed on quit ("quit unexpectedly", found in manual testing).

eframe calls on_exit on every way out, so the app now releases its player (and
with it the plugin instances) and shuts plugin hosting down there.

Refs #16

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 15:13:39 -04:00
ebbicottandClaude Opus 5.5 ccd1f995bf Shut plugin hosting down at the end of main, not only from an exit handler
Testing on macOS showed that the exit-handler fallback comes too late for a
plugin that has been used: with HALion Sonic inserted on a track, its bundleExit
segfaults, and both the app (on quit) and soundcraft-cli (after a bounce) exited
with 139. A plain scan was fine. Exit handlers run in reverse order of
registration, so state the plugin set up while in use is presumably torn down
before the host's handler runs.

soundcraft_vst3_host::shutdown() runs the module exits up front, and
soundcraft_engine::shutdown_plugin_hosts() calls it. The app calls that once the
event loop has returned (the player and its plugin instances are gone by then),
and the CLI once its subcommand has. The exit handler stays as the fallback for
other exits, such as test binaries.

The fixture can now set up state lazily the way such plugins do
(VST3_FIXTURE_LATE_STATE), and module_exit_shutdown checks both sides in child
processes: with shutdown() the exit is clean, with only the exit handler the
fixture reports the late teardown. Contract violations now end the process with
status 3 instead of an abort, so that expected failure leaves no crash report.

Refs #16

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 14:28:27 -04:00
Gert Pellin 74926df527 Desktop: write log records to standard error and a rotating log file
The desktop app installed no logger, so every log::warn!/log::error! in
the workspace was discarded: the engine's panic report, audio devices
that failed to open or broke, plugins that refused their stored state or
failed to activate, CLAP plugins' own log messages, files that failed to
open. A launch from a desktop menu has no terminal either, so there was
nothing to attach to a bug report.

apps/soundcraft/src/logging.rs (no new dependency):
- standard error plus <settings dir>/logs/soundcraft.log (beside
  ui.json, Autosave/ and Presets/); each launch rotates the previous log
  to soundcraft.1.log and .2.log, so the log of a run that crashed
  survives the next start; the file is capped at 16 MiB
- records logged before the settings directory is known are buffered
  (bounded) and written once the file is attached
- default levels: info for soundcraft*, warn for everything else;
  RUST_LOG replaces them with env_logger-style directives
- never panics: an unusable directory or a failed write leaves standard
  error as the only sink; a poisoned lock is tolerated
- runs with SOUNDCRAFT_NO_PREFS (agents' test runs) log to standard
  error only, so they don't rotate away the user's own logs

Realtime audio: a record takes a lock and does I/O, which the audio
callback must never do, yet code on the audio thread logs (the cpal
error callbacks, the synth's full event queue, a hosted plugin's failed
process, a CLAP plugin calling the host's log, the panic hook). The cpal
callbacks now mark their thread (soundcraft_mix::mark_audio_thread,
re-exported by soundcraft_playback), and the mix engine carries the mark
into the rayon workers that render strips for it. A record from a marked
thread is not written there: the first is kept in a fixed buffer
(try_lock, no allocation, never waits), the rest are counted, and the UI
thread writes them every frame (any other thread before its own next
record).

The logger is installed first in main (before the engine's panic hook)
and the file is opened after argument parsing (--version leaves no
file). The settings directory moves out of prefs_path into config_dir.
The control server's eprintln!s go through the logger (the
SOUNDCRAFT_CONTROL_PORT line on standard output stays). Documented in
README.md (Getting started > Logs) and docs/architecture.md (Audio).
2026-10-08 12:25:49 +02:00
reoniazx b44aaade42 macOS: move application menus to the system menu bar 2026-10-08 14:10:03 +08:00
Brandon ThomasandClaude Opus 5.5 f534ca4e15 Plugin presets: factory default and user presets (save/recall), mix.insert_params
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 23:51:56 -04:00
Brandon ThomasandClaude Opus 5.5 fd2a5fda4a Punch-in while playing, pre/post-roll takes trimmed to the punch range, autosave and recovery
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 23:43:20 -04:00
Brandon ThomasandClaude Opus 5.5 04d222069d Release pipeline: signed macOS/Windows, Linux packages, FreeBSD, Web; app icon
- .github/workflows/release.yml: every push to `release` builds a draft
  GitHub Release: macOS universal DMG (Developer ID + notarization),
  Windows x64/x86/arm64 MSI + zips (Azure Trusted Signing), Linux
  x86_64/aarch64 AppImage/deb/rpm/tar.gz + Flatpak manifest, FreeBSD,
  Web/WASM zip; SHA256SUMS; secrets only via the release environment
- packaging/ for every platform; .scraft + audio file associations
- cargo xtask version [set X.Y.Z] and xtask ico
- apps/soundcraft-web (trunk, WebGPU/WebGL2, WebAudio)
- placeholder app icon (original nightingale), window icon, Windows resources
- ROADMAP.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 23:17:59 -04:00
Brandon ThomasandClaude Opus 5.5 63bf6c5b4b xtask gates, parity report, model flags and full channel-format list
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 23:02:15 -04:00
Brandon ThomasandClaude Opus 5.5 f41c1310fc UI, desktop app, CLI and MCP: Edit and Mix windows, playback, agent control
- soundcraft-ui-egui: Edit window (toolbar with edit modes, zoom, tools,
  counters, grid/nudge, transport; rulers; track headers; waveforms, MIDI
  and automation lanes; Smart/Selector/Grabber/Trim/Pencil/Zoom/Scrubber
  gestures), Mix window strips, menus built from the incumbent catalog,
  dialogs, floating windows, JSON control channel, offscreen ui_shot
- soundcraft app: eframe/wgpu, cpal playback, control server, drag-drop
- soundcraft-automation: MCP server (stdio) with headless and remote
  backends; agent acceptance test of 9 realistic tasks
- soundcraft-cli: info, convert, run, script, commands, app, mcp, parity
- engine: AudioSuite offline processing command

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 22:59:40 -04:00