Skip to main content

proteus_lib/audio/
buffer.rs

1//! Shared ring buffers used for per-track audio staging.
2
3use dasp_ring_buffer::Bounded;
4use std::{
5    collections::HashMap,
6    sync::{Arc, Mutex},
7};
8
9/// Shared ring buffer for a single track's samples.
10pub type TrackBuffer = Arc<Mutex<Bounded<Vec<f32>>>>;
11/// Mapping from track key to its shared ring buffer.
12pub type TrackBufferMap = Arc<Mutex<HashMap<u16, TrackBuffer>>>;
13
14/// Initialize an empty track buffer map.
15///
16/// Each track receives its own bounded ring buffer at runtime.
17pub fn init_buffer_map() -> TrackBufferMap {
18    let track_buffers: TrackBufferMap = Arc::new(Mutex::new(HashMap::new()));
19    track_buffers
20}
21
22/// Return the remaining capacity for a track buffer.
23///
24/// If the track buffer has not been created yet, this returns `0`.
25pub fn buffer_remaining_space(
26    track_buffers: &TrackBufferMap,
27    track_key: u16,
28) -> usize {
29    let track_buffers = track_buffers.lock().unwrap();
30    match track_buffers.get(&track_key) {
31        Some(track_buffer) => {
32            let track_buffer = track_buffer.lock().unwrap();
33            track_buffer.max_len().saturating_sub(track_buffer.len())
34        }
35        None => 0,
36    }
37}