fix(qbz-audio): use alsa::pcm::Frames for ALSA buffer and period sizes

HwParams::set_buffer_size_near and set_period_size_near take alsa::pcm::Frames, which is libc::c_long: i64 on 64-bit targets but i32 on 32-bit ones. The three buffer_size computations in alsa_direct.rs cast to i64 explicitly, so the crate does not compile for any 32-bit target.

Casting to the alsa type instead is a no-op on 64-bit, where Frames already is i64, and correct on 32-bit. No behavioural change on any currently supported target: every value involved is a sample rate divided by 2, 4 or 8, so at most 96000, far below an i32 overflow.

Verified with cargo check -p qbz-audio:
  x86_64-unknown-linux-gnu       passes before and after
  arm-unknown-linux-gnueabihf    6 x E0308 before, passes after
This commit is contained in:
b0bbywan authored and GitHub committed 2026-07-26 16:42:38 -06:00
1 parent fe2be63f0f
commit 82fea6257c
1 file changed
+8 -8
+8 -8
View File
@@ -4,7 +4,7 @@
//! This module bypasses rodio/CPAL completely for direct hardware access.
#[cfg(target_os = "linux")]
use alsa::pcm::{Access, Format, HwParams, PCM};
use alsa::pcm::{Access, Format, Frames, HwParams, PCM};
#[cfg(target_os = "linux")]
use alsa::{Direction, ValueOr};
#[cfg(target_os = "linux")]
@@ -213,13 +213,13 @@ impl AlsaDirectStream {
// Set buffer size (larger buffer for high-res audio)
let buffer_size = if sample_rate >= 192000 {
// 500ms buffer for 192kHz+ (like MPD config)
(sample_rate / 2) as i64
(sample_rate / 2) as Frames
} else if sample_rate >= 96000 {
// 250ms buffer for 96kHz
(sample_rate / 4) as i64
(sample_rate / 4) as Frames
} else {
// 125ms buffer for lower rates
(sample_rate / 8) as i64
(sample_rate / 8) as Frames
};
hwp.set_buffer_size_near(buffer_size)
@@ -300,11 +300,11 @@ impl AlsaDirectStream {
hwp.set_rate(carrier_rate, ValueOr::Nearest)
.map_err(|e| format!("Failed to set DoP carrier rate {}: {}", carrier_rate, e))?;
let buffer_size = if carrier_rate >= 192000 {
(carrier_rate / 2) as i64
(carrier_rate / 2) as Frames
} else if carrier_rate >= 96000 {
(carrier_rate / 4) as i64
(carrier_rate / 4) as Frames
} else {
(carrier_rate / 8) as i64
(carrier_rate / 8) as Frames
};
hwp.set_buffer_size_near(buffer_size)
.map_err(|e| format!("Failed to set buffer size: {}", e))?;
@@ -388,7 +388,7 @@ impl AlsaDirectStream {
.map_err(|e| format!("Failed to set channels: {}", e))?;
hwp.set_rate(rate, ValueOr::Nearest)
.map_err(|e| format!("Failed to set native DSD rate {}: {}", rate, e))?;
let buffer_size = (rate / 4) as i64; // 250 ms
let buffer_size = (rate / 4) as Frames; // 250 ms
hwp.set_buffer_size_near(buffer_size)
.map_err(|e| format!("Failed to set buffer size: {}", e))?;
hwp.set_period_size_near(buffer_size / 10, ValueOr::Nearest)