Skip to main content

gstreamer_audio/
functions.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use crate::ffi;
4use glib::translate::{IntoGlibPtr, ToGlibPtr, from_glib_full};
5
6#[doc(alias = "gst_audio_buffer_clip")]
7pub fn audio_buffer_clip(
8    buffer: gst::Buffer,
9    segment: &gst::Segment,
10    rate: u32,
11    bpf: u32,
12) -> Option<gst::Buffer> {
13    skip_assert_initialized!();
14
15    unsafe {
16        from_glib_full(ffi::gst_audio_buffer_clip(
17            buffer.into_glib_ptr(),
18            segment.to_glib_none().0,
19            rate as i32,
20            bpf as i32,
21        ))
22    }
23}
24
25#[cfg(feature = "v1_16")]
26#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
27#[doc(alias = "gst_audio_buffer_truncate")]
28pub fn audio_buffer_truncate(
29    buffer: gst::Buffer,
30    bpf: u32,
31    trim: usize,
32    samples: Option<usize>,
33) -> gst::Buffer {
34    skip_assert_initialized!();
35
36    unsafe {
37        from_glib_full(ffi::gst_audio_buffer_truncate(
38            buffer.into_glib_ptr(),
39            bpf as i32,
40            trim,
41            samples.unwrap_or(usize::MAX),
42        ))
43    }
44}
45
46pub fn audio_make_raw_caps(
47    formats: &[crate::AudioFormat],
48    layout: crate::AudioLayout,
49) -> crate::AudioCapsBuilder<gst::caps::NoFeature> {
50    skip_assert_initialized!();
51
52    let formats = formats.iter().copied().map(|f| match f {
53        crate::AudioFormat::Encoded => panic!("Invalid encoded format"),
54        crate::AudioFormat::Unknown => panic!("Invalid unknown format"),
55        _ => f,
56    });
57
58    let builder = crate::AudioCapsBuilder::new().format_list(formats);
59
60    match layout {
61        crate::AudioLayout::Interleaved => builder.field("layout", "interleaved"),
62        crate::AudioLayout::NonInterleaved => builder.field("layout", "non-interleaved"),
63        crate::AudioLayout::__Unknown(_) => builder,
64    }
65}
66
67#[cfg(test)]
68mod tests {
69    use super::*;
70
71    #[test]
72    fn audio_caps() {
73        gst::init().unwrap();
74
75        let caps = audio_make_raw_caps(
76            &[crate::AudioFormat::S16be, crate::AudioFormat::S16le],
77            crate::AudioLayout::Interleaved,
78        )
79        .build();
80        assert_eq!(
81            caps.to_string(),
82            "audio/x-raw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string)interleaved, format=(string){ S16BE, S16LE }"
83        );
84
85        #[cfg(feature = "v1_18")]
86        {
87            use glib::translate::IntoGlib;
88
89            /* audio_make_raw_caps() is a re-implementation so ensure it returns the same caps as the C API */
90            let c_caps = unsafe {
91                let formats: Vec<ffi::GstAudioFormat> =
92                    [crate::AudioFormat::S16be, crate::AudioFormat::S16le]
93                        .iter()
94                        .map(|f| f.into_glib())
95                        .collect();
96                let caps = ffi::gst_audio_make_raw_caps(
97                    formats.as_ptr(),
98                    formats.len() as u32,
99                    ffi::GST_AUDIO_LAYOUT_INTERLEAVED,
100                );
101                gst::Caps::from_glib_full(caps)
102            };
103            assert_eq!(caps, c_caps);
104        }
105
106        let caps = audio_make_raw_caps(
107            &[crate::AudioFormat::S16be, crate::AudioFormat::S16le],
108            crate::AudioLayout::NonInterleaved,
109        )
110        .rate(16000)
111        .channels(2)
112        .build();
113        assert_eq!(
114            caps.to_string(),
115            "audio/x-raw, rate=(int)16000, channels=(int)2, layout=(string)non-interleaved, format=(string){ S16BE, S16LE }",
116        );
117    }
118
119    #[test]
120    #[should_panic(expected = "Invalid encoded format")]
121    fn audio_caps_encoded() {
122        gst::init().unwrap();
123        let _caps = audio_make_raw_caps(
124            &[crate::AudioFormat::Encoded],
125            crate::AudioLayout::Interleaved,
126        );
127    }
128
129    #[test]
130    #[should_panic(expected = "Invalid unknown format")]
131    fn audio_caps_unknown() {
132        gst::init().unwrap();
133        let _caps = audio_make_raw_caps(
134            &[crate::AudioFormat::Unknown],
135            crate::AudioLayout::Interleaved,
136        );
137    }
138}