Sound on Linux skips ALSA's null output when the default fails (#1810)

#1808's stand-in search ranked ALSA devices only when the host's name read "ALSA", but cpal names it "Alsa". So the ranking never ran, and the first device ALSA lists won. On the reported machine that was `null`, which discards every sample, so sound stayed silent behind a warning that it was playing.

The check now compares the host's `HostId::Alsa` variant, so the ranking applies: `pipewire`, then `pulse`, then each card's own outputs, and never `null`.

The Linux crosscheck compiles it. The ranking's tests are #1808's.

Fixes #1806

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

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

# Conflicts:
#	docs/DEVIATIONS.md

Absorbed into the octo fork. Generated docs reconciled: MAP.md stays ours, DEVIATIONS.md stays absent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn
This commit is contained in:
Sam Sung
2026-10-25 23:18:11 -06:00
committed by grom
co-authored by Claude Opus 5
parent 0fde3c281f
commit b69ea5cd04
+15 -1
View File
@@ -155,7 +155,21 @@ pub(super) fn default_output() -> Result<Device> {
},
};
let alsa = host.id().name() == "ALSA";
// By the variant, not its name: cpal names it "Alsa".
#[cfg(any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd"
))]
let alsa = host.id() == cpal::HostId::Alsa;
#[cfg(not(any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd"
)))]
let alsa = false;
let others = host.devices().into_iter().flatten().filter(|d| {
d.description()
.is_ok_and(|desc| desc.direction() != cpal::DeviceDirection::Input)