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(track_buffers: &TrackBufferMap, track_key: u16) -> usize {
26    let track_buffers = track_buffers.lock().unwrap();
27    match track_buffers.get(&track_key) {
28        Some(track_buffer) => {
29            let track_buffer = track_buffer.lock().unwrap();
30            track_buffer.max_len().saturating_sub(track_buffer.len())
31        }
32        None => 0,
33    }
34}