pipewire/
buffer.rs

1use super::stream::Stream;
2
3use spa::buffer::Data;
4use std::convert::TryFrom;
5use std::ptr::NonNull;
6
7pub struct Buffer<'s> {
8    buf: NonNull<pw_sys::pw_buffer>,
9
10    /// In Pipewire, buffers are owned by the stream that generated them.
11    /// This reference ensures that this rule is respected.
12    stream: &'s Stream,
13}
14
15impl Buffer<'_> {
16    pub(crate) unsafe fn from_raw(
17        buf: *mut pw_sys::pw_buffer,
18        stream: &Stream,
19    ) -> Option<Buffer<'_>> {
20        NonNull::new(buf).map(|buf| Buffer { buf, stream })
21    }
22
23    pub fn datas_mut(&mut self) -> &mut [Data] {
24        let buffer: *mut spa_sys::spa_buffer = unsafe { self.buf.as_ref().buffer };
25
26        let slice_of_data = if !buffer.is_null()
27            && unsafe { (*buffer).n_datas > 0 && !(*buffer).datas.is_null() }
28        {
29            unsafe {
30                let datas = (*buffer).datas as *mut Data;
31                std::slice::from_raw_parts_mut(datas, usize::try_from((*buffer).n_datas).unwrap())
32            }
33        } else {
34            &mut []
35        };
36
37        slice_of_data
38    }
39
40    #[cfg(feature = "v0_3_49")]
41    pub fn requested(&self) -> u64 {
42        unsafe { self.buf.as_ref().requested }
43    }
44}
45
46impl Drop for Buffer<'_> {
47    fn drop(&mut self) {
48        unsafe {
49            self.stream.queue_raw_buffer(self.buf.as_ptr());
50        }
51    }
52}