功能: - Tauri v2 GUI 应用 - 系统托盘支持 - 日志输出到文件 - 带时间戳的版本号 - 前端资源嵌入 修复: - 前端路径使用相对路径 - 移除 devUrl 配置 - 窗口置顶设置
47 lines
1.4 KiB
Rust
47 lines
1.4 KiB
Rust
//! 音频重采样模块
|
|
|
|
use anyhow::Result;
|
|
|
|
/// 重采样音频
|
|
///
|
|
/// 使用线性插值进行重采样
|
|
pub fn resample_audio(samples: &[f32], from_rate: u32, to_rate: u32) -> Result<Vec<f32>> {
|
|
if from_rate == to_rate {
|
|
return Ok(samples.to_vec());
|
|
}
|
|
|
|
let ratio = to_rate as f32 / from_rate as f32;
|
|
let new_len = (samples.len() as f32 * ratio) as usize;
|
|
|
|
if new_len == 0 {
|
|
return Ok(vec![]);
|
|
}
|
|
|
|
let mut resampled = Vec::with_capacity(new_len);
|
|
|
|
for i in 0..new_len {
|
|
let src_idx = i as f32 / ratio;
|
|
let src_idx_floor = src_idx.floor() as usize;
|
|
let src_idx_ceil = src_idx.ceil() as usize;
|
|
|
|
if src_idx_ceil >= samples.len() {
|
|
resampled.push(*samples.last().unwrap_or(&0.0));
|
|
} else if src_idx_floor >= samples.len() {
|
|
resampled.push(*samples.first().unwrap_or(&0.0));
|
|
} else {
|
|
let frac = src_idx - src_idx_floor as f32;
|
|
let sample = samples[src_idx_floor] * (1.0 - frac) + samples[src_idx_ceil] * frac;
|
|
resampled.push(sample);
|
|
}
|
|
}
|
|
|
|
Ok(resampled)
|
|
}
|
|
|
|
/// 使用更高品质的重采样算法 (可选)
|
|
pub fn resample_audio_high_quality(_samples: &[f32], _from_rate: u32, _to_rate: u32) -> Result<Vec<f32>> {
|
|
// TODO: 实现基于 sinc 插值的高品质重采样
|
|
// 可以使用 rubato crate 实现
|
|
todo!("高品质重采样待实现")
|
|
}
|