autd3_core/link/
buffer_pool.rs

1use crate::geometry::Geometry;
2
3use super::TxMessage;
4
5/// A tx buffer pool for single-threaded use
6#[derive(Default)]
7pub struct TxBufferPoolSync {
8    num_devices: usize,
9    buffer: Option<Vec<TxMessage>>,
10}
11
12impl TxBufferPoolSync {
13    /// Creates a new [`TxBufferPoolSync`].
14    pub const fn new() -> Self {
15        Self {
16            num_devices: 0,
17            buffer: None,
18        }
19    }
20
21    /// Sets the number of devices.
22    pub fn init(&mut self, geometry: &Geometry) {
23        self.num_devices = geometry.len();
24    }
25
26    /// Borrows a buffer from the pool.
27    pub fn borrow(&mut self) -> Vec<TxMessage> {
28        self.buffer
29            .take()
30            .unwrap_or_else(|| vec![TxMessage::new(); self.num_devices])
31    }
32
33    /// Returns a buffer to the pool.
34    pub fn return_buffer(&mut self, buffer: Vec<TxMessage>) {
35        assert_eq!(buffer.len(), self.num_devices);
36        self.buffer = Some(buffer);
37    }
38}