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:
1 parent
fe2be63f0f
commit
82fea6257c
1 file changed
+8
-8
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user