25次重大发布
0.29.0-alpha.2 | 2021年4月1日 |
---|---|
0.28.1 | 2021年3月31日 |
0.27.2 |
|
302 在 音频
每月下载 22 次
用于 rotary-core
255KB
4.5K SLoC
rotary
音频缓冲区操作库
缓冲区结构类似于 Vec<Vec<T>>
,但内部向量具有固定大小。并且缓冲区不会尝试清除数据,这些数据在使用如 Dynamic::resize 等函数释放时会被清除。
格式和拓扑结构
以下是该库支持的三个标准的音频格式
- 动态 - 每个通道存储在其自己的堆分配缓冲区中。
- 交错 - 每个通道交错存储,例如
0:0, 1:0, 1:0, 1:1
。 - 顺序 - 每个通道存储在线性缓冲区中,一个接一个。例如
0:0, 0:1, 1:0, 1:0
。
这些都实现了 Channels 和 ChannelsMut 特性,允许库作者抽象任何特定格式。缓冲区的确切通道和帧数称为其 拓扑结构。
use rotary::ChannelsMut as _;
let mut dynamic = rotary::dynamic![[0i16; 4]; 2];
let mut interleaved = rotary::interleaved![[0i16; 4]; 2];
let mut sequential = rotary::sequential![[0i16; 4]; 2];
dynamic.channel_mut(0).copy_from_iter(0i16..);
interleaved.channel_mut(0).copy_from_iter(0i16..);
sequential.channel_mut(0).copy_from_iter(0i16..);
我们还支持 包装 外部缓冲区,以便它们可以像其他rotary缓冲区一样交互操作。
示例: play-mp3
使用 minimp3-rs、cpal 和 rubato 播放mp3文件以进行重采样。
此示例可以处理任何通道和采样率配置。
cargo run --release --package rotary-examples --bin play-mp3 -- path/to/file.mp3
示例
use rand::Rng as _;
let mut buffer = rotary::Dynamic::<f32>::new();
buffer.resize_channels(2);
buffer.resize(2048);
/// Fill both channels with random noise.
let mut rng = rand::thread_rng();
rng.fill(&mut buffer[0]);
rng.fill(&mut buffer[1]);
为了方便,我们还提供了几个宏来构建各种形式的动态音频缓冲区。这些主要用于测试。
let mut buf = rotary::Dynamic::<f32>::with_topology(4, 8);
for channel in &mut buf {
for f in channel {
*f = 2.0;
}
}
assert_eq! {
buf,
rotary::dynamic![[2.0; 8]; 4],
};
assert_eq! {
buf,
rotary::dynamic![[2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0]; 4],
};
许可证:MIT/Apache-2.0