From 70426ad8a84b31c328a5b622b94bc268727bd4f5 Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Fri, 24 Apr 2026 22:14:43 -0300 Subject: [PATCH] test(audio): use raw alsa for uac sanity --- Cargo.lock | 6 ++-- client/Cargo.toml | 2 +- common/Cargo.toml | 2 +- scripts/manual/run_uac_output_sanity.sh | 43 ++++++++++++++----------- server/Cargo.toml | 2 +- 5 files changed, 31 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7fe91da..74f09bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1642,7 +1642,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "lesavka_client" -version = "0.13.9" +version = "0.13.10" dependencies = [ "anyhow", "async-stream", @@ -1676,7 +1676,7 @@ dependencies = [ [[package]] name = "lesavka_common" -version = "0.13.9" +version = "0.13.10" dependencies = [ "anyhow", "base64", @@ -1688,7 +1688,7 @@ dependencies = [ [[package]] name = "lesavka_server" -version = "0.13.9" +version = "0.13.10" dependencies = [ "anyhow", "base64", diff --git a/client/Cargo.toml b/client/Cargo.toml index cd977c8..5cf0242 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "lesavka_client" -version = "0.13.9" +version = "0.13.10" edition = "2024" [dependencies] diff --git a/common/Cargo.toml b/common/Cargo.toml index e61fc9d..7ea98b6 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lesavka_common" -version = "0.13.9" +version = "0.13.10" edition = "2024" build = "build.rs" diff --git a/scripts/manual/run_uac_output_sanity.sh b/scripts/manual/run_uac_output_sanity.sh index 6adb736..6b7cbcb 100644 --- a/scripts/manual/run_uac_output_sanity.sh +++ b/scripts/manual/run_uac_output_sanity.sh @@ -18,8 +18,6 @@ fi DURATION_SECONDS=${LESAVKA_UAC_SANITY_SECONDS:-4} TONE_FREQ=${LESAVKA_UAC_SANITY_FREQ:-880} TONE_VOLUME=${LESAVKA_UAC_SANITY_VOLUME:-0.45} -BUFFER_TIME_US=${LESAVKA_UAC_BUFFER_TIME_US:-20000} -LATENCY_TIME_US=${LESAVKA_UAC_LATENCY_TIME_US:-5000} REQUESTED_DEV=${LESAVKA_UAC_SANITY_DEV:-${LESAVKA_UAC_DEV:-hw:UAC2Gadget,0}} declare -A SEEN_CANDIDATES=() @@ -93,40 +91,49 @@ build_candidates() { run_tone() { local candidate="$1" local log + local wav log=$(mktemp) + wav=$(mktemp --suffix=.wav) echo "🎧 trying UAC playback device: $candidate" >&2 + python3 - "$wav" "$DURATION_SECONDS" "$TONE_FREQ" "$TONE_VOLUME" <<'PY' +import math, struct, sys, wave + +path, duration_s, freq_hz, volume = sys.argv[1], float(sys.argv[2]), float(sys.argv[3]), float(sys.argv[4]) +rate = 48_000 +frames = max(1, int(rate * duration_s)) +amp = max(0.0, min(volume, 1.0)) * 32767.0 +with wave.open(path, "wb") as wf: + wf.setnchannels(2) + wf.setsampwidth(2) + wf.setframerate(rate) + for index in range(frames): + sample = int(math.sin((2.0 * math.pi * freq_hz * index) / rate) * amp) + frame = struct.pack(""$log" + timeout --signal=INT "$((DURATION_SECONDS + 2))s" \ + aplay -q -D "$candidate" "$wav" \ + >"$log" 2>&1 local rc=$? set -e - if grep -Eiq 'unknown pcm|playback open error|invalid argument|no such (device|file)|^error:|could not open|failed to change state|not-negotiated' "$log"; then + if grep -Eiq 'unknown pcm|invalid argument|no such (device|file)|audio open error|device or resource busy|unable to open slave|unable to install hw params|unable to set hw params|audio open error|no such file or directory' "$log"; then echo "⚠️ tone failed on $candidate (sink open error)" >&2 sed 's/^/ /' "$log" >&2 || true rm -f "$log" + rm -f "$wav" return 1 fi if [[ $rc -eq 0 || $rc -eq 124 ]]; then echo "✅ UAC tone completed on $candidate" >&2 rm -f "$log" + rm -f "$wav" return 0 fi echo "⚠️ tone failed on $candidate (rc=$rc)" >&2 sed 's/^/ /' "$log" >&2 || true rm -f "$log" + rm -f "$wav" return "$rc" } diff --git a/server/Cargo.toml b/server/Cargo.toml index 901a548..a43d64e 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -10,7 +10,7 @@ bench = false [package] name = "lesavka_server" -version = "0.13.9" +version = "0.13.10" edition = "2024" autobins = false