gstreamer_pbutils/
audio_visualizer.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use gst::prelude::*;
4
5use crate::{ffi, subclass::AudioVisualizerSetupToken, AudioVisualizer};
6
7mod sealed {
8    pub trait Sealed {}
9    impl<T: super::IsA<super::AudioVisualizer>> Sealed for T {}
10}
11
12pub trait AudioVisualizerExtManual:
13    sealed::Sealed + IsA<AudioVisualizer> + IsA<gst::Element> + 'static
14{
15    // rustdoc-stripper-ignore-next
16    /// Returns the number of samples per frame required before calling the render method
17    fn req_spf(&self) -> u32 {
18        let sinkpad = self.static_pad("sink").expect("sink pad presence");
19        let _stream_lock = sinkpad.stream_lock();
20
21        let ptr = self.as_ptr() as *mut ffi::GstAudioVisualizer;
22        unsafe { (*ptr).req_spf }
23    }
24
25    // rustdoc-stripper-ignore-next
26    /// Modify the request of samples per frame required to be present in buffer before calling
27    /// the render method
28    fn set_req_spf(&self, spf: u32, token: &AudioVisualizerSetupToken) {
29        assert_eq!(
30            self.as_ptr() as *mut ffi::GstAudioVisualizer,
31            token.0.as_ptr()
32        );
33
34        let sinkpad = self.static_pad("sink").expect("sink pad presence");
35        let _stream_lock = sinkpad.stream_lock();
36
37        let ptr = self.as_ptr() as *mut ffi::GstAudioVisualizer;
38        unsafe {
39            (*ptr).req_spf = spf;
40        }
41    }
42
43    fn audio_info(&self) -> gst_audio::AudioInfo {
44        let sinkpad = self.static_pad("sink").expect("sink pad presence");
45        let _stream_lock = sinkpad.stream_lock();
46
47        let ptr = self.as_ptr() as *mut ffi::GstAudioVisualizer;
48        unsafe {
49            let info = &(*ptr).ainfo;
50            glib::translate::from_glib_none(glib::translate::mut_override(
51                info as *const gst_audio::ffi::GstAudioInfo,
52            ))
53        }
54    }
55
56    fn video_info(&self) -> gst_video::VideoInfo {
57        let srcpad = self.static_pad("src").expect("src pad presence");
58        let _stream_lock = srcpad.stream_lock();
59
60        let ptr = self.as_ptr() as *mut ffi::GstAudioVisualizer;
61        unsafe {
62            let info = &(*ptr).vinfo;
63            glib::translate::from_glib_none(glib::translate::mut_override(
64                info as *const gst_video::ffi::GstVideoInfo,
65            ))
66        }
67    }
68}
69
70impl<O: IsA<AudioVisualizer> + IsA<gst::Element>> AudioVisualizerExtManual for O {}