Files
benilla-octo/Cargo.toml
T
Sam SungandClaude Opus 5 f83533b2a6 Linux audio plays: cpal 0.17.3 fixes ALSA's stalled callback (#1785)
On some Linux setups the game was silent. The device opened, but its data callback ran once and stopped, with no error. The music position never moved.

This is cpal 0.17.1's ALSA bug (RustAudio/cpal#1099, "Data callback called only once on ALSA"), fixed in 0.17.3 by setting playback's `avail_min` to one period. benilla's stream starts only at the start threshold, which is exactly that case. cpal goes to 0.17.3.

alsa 0.11 and bevy_audio's unbuilt cpal 0.15 cannot share a lock (`links = "alsa"`). A lock-only stand-in for alsa 0.9 settles that, documented in `third_party/alsa-0.9`.

The realtime-fallback log line now says what happens on each platform. Following the default device gets its `Deviation:` line: 1.12.1 initialises sound once (`0x7a4330`).

Built on macOS, with Linux and Windows linted.

Fixes #820

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit d93c231d8ebb27934791b726a0575f4c9b709446)

# Conflicts:
#	Cargo.toml
#	crates/benilla-app/examples/extended_launcher.rs
#	docs/DEVIATIONS.md

Absorbed into the octo fork. Cargo.toml unions both patch entries (our mlua-sys traceback patch and upstream's alsa 0.9 lock-only stand-in). Cargo.lock is regenerated locally rather than taken from upstream, with cargo update -p cpal@0.17.1 --precise 0.17.3: cargo reaches the same resolution (alsa 0.9.1 from the stand-in, alsa 0.11 + alsa-sys 0.4 for the built cpal, windows-* dropped), so it is our own lock, resolved here. examples/extended_launcher.rs is upstream-only and stays absent. cargo check -p benilla-app clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn
2026-10-25 23:12:32 -06:00

96 lines
4.6 KiB
TOML

[workspace]
resolver = "2"
members = ["crates/*"]
[workspace.package]
version = "0.2.0"
edition = "2021"
license = "MIT OR Apache-2.0"
authors = ["sam <samuv.eth@gmail.com>"]
# A version two crates share is pinned in `[workspace.dependencies]`; feature additions stay per
# crate. `image` stays per-crate: its consumers differ on default features, and a member cannot
# turn off default features that a workspace entry enables.
# `too_many_arguments` is off: a Bevy system's parameter list is its dependency declaration.
[workspace.lints.clippy]
too_many_arguments = "allow"
[workspace.dependencies]
anyhow = "1.0.102"
# bevy's default features spelled out without `audio`: `2d`, `3d` and `ui` each pull `bevy_audio`
# and `vorbis`, and the client mixes through kira. Add a feature by name, never `2d`/`3d`/`ui`; a
# plugin that takes bevy with its default features brings the audio stack back too.
bevy = { version = "0.18.1", default-features = false, features = [
"default_app",
"default_platform",
"2d_bevy_render",
"3d_bevy_render",
"ui_api",
"ui_bevy_render",
"scene",
"picking",
] }
# For the `WOW_GPU_MS` meter's query set, which bevy 0.18 does not wrap; must match bevy's wgpu.
wgpu = "27"
clap = { version = "4.6.1", features = ["derive"] }
sha1 = "0.10.6"
# lua-src builds the addon VM's Lua 5.1.5, patched to accept exactly the 1.12 client's grammar;
# the hunks and the command that checks them: `third_party/lua-src/BENILLA.md`.
[patch.crates-io]
lua-src = { path = "third_party/lua-src" }
# kira 0.12.1, patched to compute spatial gains and the volume tween per output chunk and
# interpolate them, not per sample frame (`third_party/kira/BENILLA.md`).
kira = { path = "third_party/kira" }
# mlua-sys 0.10.0, patched so its Lua 5.1 traceback names a frame from `lua_getinfo`, as 5.1's own
# `debug.traceback` does, instead of searching the whole global table per stack level. mlua builds
# that traceback for every `Err` a Rust binding returns, which on this interface's 27,114 globals
# cost ~7 ms a raise — invisibly, for the raises an addon wraps in `pcall`: five a frame measured
# 44.7 ms of VM tick with an empty error log (`third_party/mlua-sys/BENILLA.md`).
mlua-sys = { path = "third_party/mlua-sys" }
# A lock-only stand-in: bevy_audio's unbuilt cpal 0.15 would otherwise hold `alsa-sys` 0.3 against
# cpal 0.17's 0.4, and a lock holds one `links = "alsa"` (`third_party/alsa-0.9/BENILLA.md`).
alsa = { path = "third_party/alsa-0.9" }
# Dependencies at opt-level 3 in dev: at opt-level 0, avian/parry collision drops a run to <1 fps.
# Line tables only, and never packed into the binary, for the reason under `[profile.dev]` below.
[profile.dev.package."*"]
opt-level = 3
debug = "line-tables-only"
split-debuginfo = "unpacked"
# Our crates at opt-level 1: Bevy's generic hot paths monomorphize into them, and at opt-level 0
# Stormwind drops from a pinned 60 fps to ~45; the warm incremental rebuild cost is ~0.
[profile.dev]
opt-level = 1
# Line tables only, not `debug = 2`. DWARF is ~97% of what rustc writes for this tree: the largest
# benilla-app codegen unit measured 145 MB, of which 61 MB was `.debug_str` and 13 MB
# `.debug_info` against 1.5 MB of `.text`. Carrying that cost a 1.5 GB `libbenilla_app` rlib, a
# 2.9 GB test binary and an 82 GB `target/debug`, which filled the disk on a 1 TB volume and made
# every write slower for it. `.debug_line` survives, so a panic backtrace and `gdb`'s `bt` still
# name a file and a line; `split-debuginfo` leaves the rest in the object files rather than copying
# it into the linked binary, which is what the link step paid for.
#
# This supersedes "no debuginfo trimming measures no recurring win", which was measured on macOS
# with sccache and no disk pressure. Re-measure on macOS before assuming it holds there.
debug = "line-tables-only"
split-debuginfo = "unpacked"
# The shipping build (`--profile ship`): fat LTO measures -1.0 cpu_ms (-5 %) against `release`,
# which stays the measured profile because fat LTO's link time would tax every iteration.
# `-Ctarget-cpu=native` is not set: it is not portable.
[profile.ship]
inherits = "release"
lto = "fat"
codegen-units = 1
# `release` plus incremental, run as `cargo play`: under `release` a one-line edit to
# `benilla-app` costs 2m47s. Incremental applies to workspace members only, so dependencies stay
# sccache-cacheable; it changes codegen, so it lives here and not in the measured `release`.
[profile.play]
inherits = "release"
incremental = true
# Not for speed: under `incremental`, thin-local LTO leaves promoted `anon.*.llvm.*` symbols
# unresolved and the link fails intermittently (rustc #86049).
lto = "off"