+pub struct NABufferPool {
+ pool: Vec<NABufferRef<NABufferType>>,
+ max_len: usize,
+}
+
+impl NABufferPool {
+ pub fn new(max_len: usize) -> Self {
+ Self {
+ pool: Vec::with_capacity(max_len),
+ max_len,
+ }
+ }
+ pub fn prealloc_video(&mut self, vinfo: NAVideoInfo, align: u8) -> Result<(), AllocatorError> {
+ let nbufs = self.max_len - self.pool.len();
+ for _ in 0..nbufs {
+ let buf = alloc_video_buffer(vinfo.clone(), align)?;
+ self.pool.push(NABufferRef::new(buf));
+ }
+ Ok(())
+ }
+ pub fn prealloc_audio(&mut self, ainfo: NAAudioInfo, nsamples: usize, chmap: NAChannelMap) -> Result<(), AllocatorError> {
+ let nbufs = self.max_len - self.pool.len();
+ for _ in 0..nbufs {
+ let buf = alloc_audio_buffer(ainfo.clone(), nsamples, chmap.clone())?;
+ self.pool.push(NABufferRef::new(buf));
+ }
+ Ok(())
+ }
+ pub fn add(&mut self, buf: NABufferType) -> bool {
+ if self.pool.len() < self.max_len {
+ self.pool.push(NABufferRef::new(buf));
+ true
+ } else {
+ false
+ }
+ }
+ pub fn get_free(&mut self) -> Option<NABufferRef<NABufferType>> {
+ for e in self.pool.iter() {
+ if e.get_num_refs() == 1 {
+ return Some(e.clone());
+ }
+ }
+ None
+ }
+}
+