libobs_wrapper\encoders/
property_helper.rs

1use std::{collections::HashMap, str::FromStr, sync::Arc};
2
3use duplicate::duplicate_item;
4
5use crate::{
6    context::ObsContext,
7    data::{
8        output::ObsOutputRef,
9        properties::{
10            get_properties_inner, ObsProperty, ObsPropertyObject, ObsPropertyObjectPrivate,
11        },
12        ObsData,
13    },
14    run_with_obs,
15    runtime::ObsRuntime,
16    unsafe_send::Sendable,
17    utils::{ObjectInfo, ObsError, ObsString},
18};
19
20use super::{
21    audio::ObsAudioEncoder, video::ObsVideoEncoder, ObsAudioEncoderType, ObsVideoEncoderType,
22};
23
24#[duplicate_item(
25    StructName EncoderType;
26    [ObsAudioEncoderBuilder] [ObsAudioEncoderType];
27    [ObsVideoEncoderBuilder] [ObsVideoEncoderType]
28)]
29#[derive(Debug)]
30pub struct StructName {
31    encoder_id: EncoderType,
32    runtime: ObsRuntime,
33    //TODO: keeping this for now, maybe it'll be useful later
34    _context: ObsContext,
35    settings: Option<ObsData>,
36    hotkey_data: Option<ObsData>,
37}
38
39#[duplicate_item(
40    StructName EncoderType;
41    [ObsAudioEncoderBuilder] [ObsAudioEncoderType];
42    [ObsVideoEncoderBuilder] [ObsVideoEncoderType]
43)]
44impl StructName {
45    pub fn new(context: ObsContext, encoder_id: &str) -> Self {
46        Self {
47            encoder_id: EncoderType::from_str(encoder_id).unwrap(),
48            runtime: context.runtime().clone(),
49            _context: context,
50            settings: None,
51            hotkey_data: None,
52        }
53    }
54
55    pub fn get_encoder_id(&self) -> &EncoderType {
56        &self.encoder_id
57    }
58
59    pub fn set_settings(&mut self, settings: ObsData) -> &mut Self {
60        self.settings = Some(settings);
61        self
62    }
63
64    pub fn set_hotkey_data(&mut self, hotkey_data: ObsData) -> &mut Self {
65        self.hotkey_data = Some(hotkey_data);
66        self
67    }
68
69    pub fn get_settings(&self) -> Option<&ObsData> {
70        self.settings.as_ref()
71    }
72
73    pub fn get_hotkey_data(&self) -> Option<&ObsData> {
74        self.hotkey_data.as_ref()
75    }
76
77    pub fn get_settings_mut(&mut self) -> Option<&mut ObsData> {
78        self.settings.as_mut()
79    }
80
81    pub fn get_hotkey_data_mut(&mut self) -> Option<&mut ObsData> {
82        self.hotkey_data.as_mut()
83    }
84}
85
86impl ObsAudioEncoderBuilder {
87    pub fn apply_to_context(
88        self,
89        output: &mut ObsOutputRef,
90        name: &str,
91        settings: Option<ObsData>,
92        hotkey_data: Option<ObsData>,
93        mixer_idx: usize,
94    ) -> Result<Arc<ObsAudioEncoder>, ObsError> {
95        let e_id: ObsString = self.encoder_id.into();
96        let info = ObjectInfo::new(e_id, ObsString::new(name), settings, hotkey_data);
97
98        output.create_and_set_audio_encoder(info, mixer_idx)
99    }
100}
101
102impl ObsVideoEncoderBuilder {
103    pub fn set_to_output(
104        self,
105        output: &mut ObsOutputRef,
106        name: &str,
107    ) -> Result<Arc<ObsVideoEncoder>, ObsError> {
108        let e_id: ObsString = self.encoder_id.into();
109        let info = ObjectInfo::new(e_id, ObsString::new(name), self.settings, self.hotkey_data);
110
111        output.create_and_set_video_encoder(info)
112    }
113}
114
115#[duplicate_item(
116    StructName;
117    [ObsAudioEncoderBuilder];
118    [ObsVideoEncoderBuilder]
119)]
120impl ObsPropertyObject for StructName {
121    fn get_properties(&self) -> Result<HashMap<String, ObsProperty>, ObsError> {
122        let properties_raw = self.get_properties_raw()?;
123        get_properties_inner(properties_raw, self.runtime.clone())
124    }
125}
126
127#[duplicate_item(
128    StructName;
129    [ObsAudioEncoderBuilder];
130    [ObsVideoEncoderBuilder]
131)]
132impl ObsPropertyObjectPrivate for StructName {
133    fn get_properties_raw(&self) -> Result<Sendable<*mut libobs::obs_properties_t>, ObsError> {
134        let encoder_name: ObsString = self.encoder_id.clone().into();
135        let encoder_name_ptr = encoder_name.as_ptr();
136
137        run_with_obs!(self.runtime, (encoder_name_ptr), move || unsafe {
138            Sendable(libobs::obs_get_encoder_properties(encoder_name_ptr))
139        })
140    }
141
142    fn get_properties_by_id_raw<T: Into<ObsString> + Sync + Send>(
143        id: T,
144        runtime: ObsRuntime,
145    ) -> Result<Sendable<*mut libobs::obs_properties_t>, ObsError> {
146        let id: ObsString = id.into();
147        let id_ptr = id.as_ptr();
148        run_with_obs!(runtime, (id_ptr), move || unsafe {
149            Sendable(libobs::obs_get_encoder_properties(id_ptr))
150        })
151    }
152}