wayclip-daemon 0.2.0

Recording and management of Wayclip daemon
use gstreamer::Element;
use wayclip_core::{models::error::WayclipError, settings::UserSettings};

use crate::common::gst::{
    GStreamer,
    caps::GStreamerCapsType,
    element::{GStreamerElement, GStreamerElementType},
};

pub mod device;

pub const DEFAULT_AUDIO_CHANNELS: i32 = 2;

pub struct AudioBranchBuilder<'a> {
    user_settings: &'a UserSettings,
}

impl<'a> AudioBranchBuilder<'a> {
    pub fn new(user_settings: &'a UserSettings) -> Self {
        Self { user_settings }
    }

    pub fn build(self) -> Result<(Element, Vec<Element>), WayclipError> {
        let mix = GStreamer::build_element(GStreamerElementType::AudioMixer)?;

        let convert = GStreamer::build_element(GStreamerElementType::AudioConvert)?;

        let caps = GStreamer::build_caps(GStreamerCapsType::AudioXRaw {
            rate: None,
            channels: DEFAULT_AUDIO_CHANNELS,
        });
        let caps_filter = GStreamer::build_element(GStreamerElementType::CapsFilter { caps })?;

        let encoder = GStreamerElement::new(
            self.user_settings.recording.audio.codec.get_encoder(),
            vec![],
        )
        .build_element()?;

        let parser = GStreamerElement::new(
            self.user_settings.recording.audio.codec.get_parser(),
            vec![],
        )
        .build_element()?;

        let queue = GStreamer::build_element(GStreamerElementType::AudioQueue)?;

        Ok((
            mix.clone(),
            vec![mix, convert, caps_filter, encoder, parser, queue],
        ))
    }
}